rm(list = ls())

Libraries

library(data.table)
library(tidyr)
library(maps)
library(haven)
library(ggplot2)
library(dplyr)
library(readxl)
library(ggrepel)
library(wordcloud)
library(lme4)
library(lmerTest)
library(reshape2)
library(patchwork)
library(psych)

PREP THE DATASET FOR ANALYSIS WVS 5 & 6 ####################

#read the data (Wave 5)

# Data of Wave 5
WV5_data <- readRDS("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/WV6_dataset_wave_5_6/F00007944-WV5_Data_R_v20180912.rds")

# Convert WV5_data-object in data.frame 
WV5_data_df <- as.data.frame(WV5_data)

# show first five columns
WV5_data_df

clean the data set

#rename the variables
WV5_data <- WV5_data_df %>%
  rename(gender = V235, age = V237, country_code = V2, wave = V1, risktaking = V86, children = V56, married = V55, employed = V241, education = V238)
WV5_data

colnames(WV5_data)
  [1] "wave"          "V1A"           "V1B"           "country_code"  "V2A"           "V3"            "V4"           
  [8] "V4_CO"         "V5"            "V5_CO"         "V6"            "V6_CO"         "V7"            "V7_CO"        
 [15] "V8"            "V8_CO"         "V9"            "V9_CO"         "V10"           "V11"           "V12"          
 [22] "V13"           "V14"           "V15"           "V16"           "V17"           "V18"           "V19"          
 [29] "V20"           "V21"           "V22"           "V23"           "V24"           "V25"           "V26"          
 [36] "V27"           "V28"           "V29"           "V30"           "V31"           "V32"           "V33"          
 [43] "V34"           "V35"           "V36"           "V37"           "V38"           "V39"           "V40"          
 [50] "V41"           "V42"           "V43"           "V43_01"        "V43_02"        "V43_03"        "V43_04"       
 [57] "V43_05"        "V43_06"        "V43_07"        "V43_08"        "V43_09"        "V43_10"        "V43_11"       
 [64] "V43_12"        "V43_13"        "V43_14"        "V43_15"        "V43_16"        "V43_17"        "V43_18"       
 [71] "V43_19"        "V43_20"        "V43_21"        "V43_22"        "V43_23"        "V43_24"        "V43_25"       
 [78] "V43_26"        "V43_27"        "V43_28"        "V43_29"        "V43_30"        "V44"           "V45"          
 [85] "V46"           "V47"           "V48"           "V49"           "V50"           "V51"           "V52"          
 [92] "V53"           "V54"           "married"       "children"      "V57"           "V58"           "V59"          
 [99] "V60"           "V61"           "V62"           "V63"           "V64"           "V65"           "V66"          
[106] "V67"           "V68"           "V69"           "V69_HK"        "V70"           "V70_HK"        "V71"          
[113] "V72"           "V73"           "V73_HK"        "V74"           "V74_HK"        "V75"           "V76"          
[120] "V77"           "V78"           "V79"           "V80"           "V81"           "V82"           "V83"          
[127] "V84"           "V85"           "risktaking"    "V87"           "V88"           "V89"           "V90"          
[134] "V91"           "V92"           "V93"           "V94"           "V95"           "V96"           "V97"          
[141] "V98"           "V99"           "V100"          "V101"          "V102"          "V103"          "V104"         
[148] "V105"          "V106"          "V107"          "V108"          "V109"          "V110"          "V111"         
[155] "V112"          "V113"          "V114"          "V115"          "V116"          "V117"          "V118"         
[162] "V119"          "V120"          "V121"          "V122"          "V123"          "V124"          "V125"         
[169] "V126"          "V127"          "V128"          "V129"          "V130"          "V130_CA_1"     "V130_IQ_1"    
[176] "V130_IQ_2"     "V130_IQ_3"     "V130_IQ_4"     "V130_NZ_1"     "V130_NZ_2"     "V131"          "V132"         
[183] "V133"          "V134"          "V135"          "V136"          "V137"          "V138"          "V139"         
[190] "V140"          "V141"          "V142"          "V143"          "V144"          "V145"          "V146_00"      
[197] "V146_01"       "V146_02"       "V146_03"       "V146_04"       "V146_05"       "V146_06"       "V146_07"      
[204] "V146_08"       "V146_09"       "V146_10"       "V146_11"       "V146_12"       "V146_13"       "V146_14"      
[211] "V146_15"       "V146_16"       "V146_17"       "V146_18"       "V146_19"       "V146_20"       "V146_21"      
[218] "V146_22"       "V147"          "V148"          "V149"          "V150"          "V151"          "V151_IQ_A"    
[225] "V151_IQ_B"     "V152"          "V153"          "V154"          "V155"          "V156"          "V157"         
[232] "V158"          "V159"          "V160"          "V161"          "V162"          "V163"          "V164"         
[239] "V165"          "V166"          "V167"          "V168"          "V169"          "V170"          "V171"         
[246] "V172"          "V173"          "V174"          "V175"          "V176"          "V177"          "V178"         
[253] "V179"          "V180"          "V181"          "V182"          "V183"          "V184"          "V185"         
[260] "V186"          "V187"          "V188"          "V189"          "V190"          "V191"          "V192"         
[267] "V193"          "V194"          "V195"          "V196"          "V197"          "V198"          "V199"         
[274] "V200"          "V201"          "V202"          "V203"          "V204"          "V205"          "V206"         
[281] "V207"          "V208"          "V209"          "V210"          "V211"          "V212"          "V213A"        
[288] "V213B"         "V213C"         "V213D"         "V213E"         "V213F"         "V213G"         "V213H"        
[295] "V213K"         "V213L"         "V213M"         "V213N"         "V214"          "V215"          "V216"         
[302] "V217"          "V218"          "V219"          "V220"          "V221"          "V222"          "V223"         
[309] "V224"          "V225"          "V226"          "V227"          "V228"          "V229"          "V230"         
[316] "V231"          "V232"          "V233"          "V233A"         "V234"          "gender"        "V236"         
[323] "age"           "education"     "V238CS"        "V239"          "V240"          "employed"      "V242"         
[330] "V242A_CO"      "V243"          "V244"          "V245"          "V246"          "V247"          "V248"         
[337] "V249"          "V250"          "V251"          "V252"          "V252B"         "V253"          "V253CS"       
[344] "V254"          "V255"          "V255CS"        "V256"          "V257"          "V257B"         "V257C"        
[351] "V258"          "V259"          "V259A"         "V260"          "V261"          "V262"          "V263"         
[358] "V264"          "V265"          "S024"          "S025"          "Y001"          "Y002"          "Y003"         
[365] "SACSECVAL"     "SECVALWGT"     "RESEMAVAL"     "WEIGHTB"       "I_AUTHORITY"   "I_NATIONALISM" "I_DEVOUT"     
[372] "DEFIANCE"      "WEIGHT1A"      "I_RELIGIMP"    "I_RELIGBEL"    "I_RELIGPRAC"   "DISBELIEF"     "WEIGHT2A"     
[379] "I_NORM1"       "I_NORM2"       "I_NORM3"       "RELATIVISM"    "WEIGHT3A"      "I_TRUSTARMY"   "I_TRUSTPOLICE"
[386] "I_TRUSTCOURTS" "SCEPTICISM"    "WEIGHT4A"      "I_INDEP"       "I_IMAGIN"      "I_NONOBED"     "AUTONOMY"     
[393] "WEIGHT1B"      "I_WOMJOB"      "I_WOMPOL"      "I_WOMEDU"      "EQUALITY"      "WEIGHT2B"      "I_HOMOLIB"    
[400] "I_ABORTLIB"    "I_DIVORLIB"    "CHOICE"        "WEIGHT3B"      "I_VOICE1"      "I_VOICE2"      "I_VOI2_00"    
[407] "VOICE"         "WEIGHT4B"      "S001"          "S007"          "S018"          "S019"          "S021"         
[414] "COW"          
#select only the variables of interest
WV5_data <- WV5_data %>%
  dplyr::select(gender, age, country_code, wave, risktaking, children, employed, education, married)
WV5_data

Read countrynames data from the CSV file (to decode the dataset 5)

countrynames <- read.csv("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/WV6_dataset_wave_5_6/countrynames.txt", header = FALSE, as.is = TRUE)
colnames(countrynames) <- c("code", "name")

# Assuming WV5_data has a column named country_code
WV5_data$country <- countrynames$name[match(WV5_data$country_code, countrynames$code)]

# Check the frequency of each country in the new column
table(WV5_data$country)

              Andorra             Argentina             Australia                Brazil              Bulgaria 
                 1003                  1002                  1421                  1500                  1001 
         Burkina Faso                Canada                 Chile                 China              Colombia 
                 1534                  2164                  1000                  1991                  3025 
           Cyprus (G)                 Egypt              Ethiopia               Finland                France 
                 1050                  3051                  1500                  1014                  1001 
              Georgia               Germany                 Ghana         Great Britain             Guatemala 
                 1500                  2064                  1534                  1041                  1000 
            Hong Kong               Hungary                 India             Indonesia                  Iran 
                 1252                  1007                  2001                  2015                  2667 
                 Iraq                 Italy                 Japan                Jordan              Malaysia 
                 2701                  1012                  1096                  1200                  1201 
                 Mali                Mexico               Moldova               Morocco           Netherlands 
                 1534                  1560                  1046                  1200                  1050 
          New Zealand                Norway                  Peru                Poland               Romania 
                  954                  1025                  1500                  1000                  1776 
               Russia                Rwanda Serbia and Montenegro              Slovenia          South Africa 
                 2033                  1507                  1220                  1037                  2988 
          South Korea                 Spain                Sweden           Switzerland                Taiwan 
                 1200                  1200                  1003                  1241                  1227 
             Thailand   Trinidad and Tobago                Turkey               Ukraine         United States 
                 1534                  1002                  1346                  1000                  1249 
              Uruguay              Viet Nam                Zambia 
                 1000                  1495                  1500 
# Display the updated WV5_data
print(WV5_data)

#Read Dataset (Wave 6)

load("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/WV6_dataset_wave_5_6/WV6_Data_R_v20201117.rdata") 
WV6_data <- WV6_Data_R_v20201117 

print(WV6_data)

#rename variables

WV6_data <- WV6_data %>%
  rename(wave = V1, gender = V240, age = V242,country_code = V2, risktaking = V76, children = V58, married = V57, employed = V229, education = V248)

#select only the variables of interest
WV6_data <- WV6_data %>%
  dplyr::select(gender, age, country_code, wave, risktaking, children, employed, education, married)
WV6_data

#decode daraset (Wave 6)

countrynames = read.csv("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/WV6_dataset_wave_5_6/countrynames.txt", header=FALSE,as.is=TRUE)
colnames(countrynames) = c("code", "name")
WV6_data$country = countrynames$name [match(WV6_data$country_code, countrynames$code)]
table(WV6_data$country)

            Algeria           Argentina             Armenia           Australia          Azerbaijan             Belarus 
               1200                1030                1100                1477                1002                1535 
             Brazil               Chile               China            Colombia          Cyprus (G)             Ecuador 
               1486                1000                2300                1512                1000                1202 
              Egypt             Estonia             Georgia             Germany               Ghana               Haiti 
               1523                1533                1202                2046                1552                1996 
          Hong Kong               India                Iraq               Japan              Jordan          Kazakhstan 
               1000                4078                1200                2443                1200                1500 
             Kuwait          Kyrgyzstan             Lebanon               Libya            Malaysia              Mexico 
               1303                1500                1200                2131                1300                2000 
            Morocco         Netherlands         New Zealand             Nigeria            Pakistan           Palestine 
               1200                1902                 841                1759                1200                1000 
               Peru         Philippines              Poland               Qatar             Romania              Russia 
               1210                1200                 966                1060                1503                2500 
             Rwanda           Singapore            Slovenia        South Africa         South Korea               Spain 
               1527                1972                1069                3531                1200                1189 
             Sweden              Taiwan            Thailand Trinidad and Tobago             Tunisia              Turkey 
               1206                1238                1200                 999                1205                1605 
            Ukraine       United States             Uruguay          Uzbekistan               Yemen            Zimbabwe 
               1500                2232                1000                1500                1000                1500 
WV6_data

#combine the 2 dataset (Wave 6 + Wave 5)

WVS_data = rbind(WV5_data, WV6_data)
WVS_data

#exclusion of participants and omission of missing data (na)

WVS_data = subset(WVS_data, risktaking > 0 & gender > 0 & age >0 & education > 0 & employed > 0 & married > 0 & children >= 0)
### WVS_data <- na.omit(WVS_data) ### excluded because it is not in code from Mata et al., 2016

# Use the mutate function to change the country name
WVS_data <- WVS_data %>%
  mutate(country = ifelse(country == "Great Britain", "United Kingdom", country))
head(WVS_data)

controll data

length(unique(WVS_data$country)) 
[1] 77
nrow(WVS_data) # number of individuals 
[1] 149626
range(WVS_data$age, na.rm=TRUE) 
[1] 15 99
table(WVS_data$gender) # sex table(data$sex)/nrow(data) 

    1     2 
71689 77937 

create a categorical age variable (for example, to plot response frequencies by category)

WVS_data$agecat[WVS_data$age<20]="15-19"
WVS_data$agecat[WVS_data$age>=20 & WVS_data$age <30] = "20-29"
WVS_data$agecat[WVS_data$age>=30 & WVS_data$age <40] = "30-39"
WVS_data$agecat[WVS_data$age>=40 & WVS_data$age <50] = "40-49"
WVS_data$agecat[WVS_data$age>=50 & WVS_data$age <60] = "50-59"
WVS_data$agecat[WVS_data$age>=60 & WVS_data$age <70] = "60-69"
WVS_data$agecat[WVS_data$age>=70 & WVS_data$age <80] = "70-79"
WVS_data$agecat[WVS_data$age>=80] = "80+"

table(WVS_data$age)

  15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36   37   38   39   40 
  56  377  530 3386 3309 3734 3373 3605 3766 3639 3858 3532 3584 3500 3252 3969 3059 3302 2959 2917 3585 3073 2883 3054 2737 3600 
  41   42   43   44   45   46   47   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64   65   66 
2582 3114 2759 2597 3130 2570 2490 2453 2384 2990 2227 2407 2111 2140 2408 2069 2004 1909 1597 2202 1579 1764 1607 1416 1722 1352 
  67   68   69   70   71   72   73   74   75   76   77   78   79   80   81   82   83   84   85   86   87   88   89   90   91   92 
1155 1239  995 1380  907 1002  896  761  782  687  590  485  395  429  337  283  264  231  212   97   71   48   49   39   16   12 
  93   94   95   97   98   99 
  14   12    6    4    4    2 
table(WVS_data$agecat)

15-19 20-29 30-39 40-49 50-59 60-69 70-79   80+ 
 7658 35843 31538 27679 21862 15031  7885  2130 

create a categorical education variable (with fewer categories than the original)

# Neue Spalte 'education_cat' erstellen und initialisieren
WVS_data$education_cat <- NA

# Kategorien zuweisen basierend auf den Bildungsstufen
WVS_data$education_cat <- ifelse(WVS_data$education %in% c(1, 2), "incomplete or no primary education", 
                          ifelse(WVS_data$education %in% c(3, 4, 5, 6), "No Uni",
                          ifelse(WVS_data$education %in% c(7, 8, 9), "Uni", NA)))

# Tabelle der neuen Kategorien anzeigen
table(WVS_data$education_cat)

incomplete or no primary education                             No Uni                                Uni 
                             19354                              70033                              60239 

Dichotomizing Variables: This helps estimating and interpreting the models later on…

WVS_data$gender = ifelse(WVS_data$gender == 1, 0, 1) # sex: male vs. female
WVS_data$children = ifelse(WVS_data$children == 0, 0, 1) # children: no vs. yes
WVS_data$married = ifelse(WVS_data$married == 1, 1, 0) # married: yes vs. no
WVS_data$employed = ifelse(WVS_data$employed < 4, 1, 0) # employed: yes vs. no
WVS_data$education = ifelse(WVS_data$education < 4, 0, 1) # education: no primary vs. primary+ 
head(WVS_data)

Control the data

length(unique(WVS_data$country))
[1] 77
nrow(WVS_data)
[1] 149626
range(WVS_data$age)
[1] 15 99
table(WVS_data$gender)

    0     1 
71689 77937 
table(WVS_data$children)

     0      1 
 44434 105192 
table(WVS_data$married)

    0     1 
66354 83272 
table(WVS_data$employed)

    0     1 
69519 80107 
table(WVS_data$education)

     0      1 
 38011 111615 
mean(WVS_data$age)
[1] 41.59569
mean(WVS_data$risktaking)
[1] 3.801345

PREP THE DATASET FOR ANALYSIS HARDSHIP ####################

read in file that contains hardship indicators manually collected from CIA factbook, WHO, and World Bank

csv_path <- "/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/Data_Mata_et_al._2016/countryfacts_selection_new.csv"
countryfacts <- read.csv(csv_path, as.is = TRUE, header = TRUE) 


labels=c("code","country","codeWVS","Homicide","GDP","InfMort","LifeExp","GINI","GenderPEdu")
names(countryfacts)=labels

missings=colSums(is.na(countryfacts[,4:9]))/77 # proportion of missing values for each of the hardship indicators

unique(WVS_data$country_code) %in% countryfacts$codeWVS # check that all countries in the subset of the WVS data are included in the countryfacts file
 [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[26] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[51] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[76] TRUE TRUE
countryfacts

Control the data

mean(countryfacts$Homicide, na.rm = TRUE)
[1] 6.779793
mean(countryfacts$GDP, na.rm = TRUE)
[1] 20123.38
mean(countryfacts$LifeExp, na.rm = TRUE)
[1] 73.25052

Plot histogram of all hardship indicators

# Plot histogram of all hardship indicators
combined_plot <- NULL # Leeres Plot-Objekt erstellen

# Define the vector of labels for the items
items <- c("Homicide","GDP","InfMort","LifeExp","GINI","GenderPEdu")

# Loop durch jedes Item und füge das Histogramm zum kombinierten Plot hinzu
for (item in items) {
  # Erstelle ein Histogramm für das aktuelle Item
  plot <- ggplot(countryfacts, aes_string(x = item)) +
    geom_histogram(binwidth = 1, fill = "skyblue", color = "black") +
    labs(title = paste(item),
         x = item,
         y = "Frequency") +
    theme_minimal()
  
  # Füge das Histogramm zum kombinierten Plot hinzu
  if (is.null(combined_plot)) {
    combined_plot <- plot
  } else {
    combined_plot <- combined_plot + plot
  }
}

# Zeige den kombinierten Plot an
combined_plot

log transform

countryfacts$Homicide=log(countryfacts$Homicide)
countryfacts$GDP=log(countryfacts$GDP)
countryfacts$InfMort=log(countryfacts$InfMort)
countryfacts$LifeExp=log(countryfacts$LifeExp)
#countryfacts$GINI=log(countryfacts$GINI) # not transformed
countryfacts$GenderPEdu=log(countryfacts$GenderPEdu)

countryfacts

Control the data

mean(countryfacts$Homicide, na.rm = TRUE)
[1] 1.31584
mean(countryfacts$GDP, na.rm = TRUE)
[1] 9.413843
mean(countryfacts$LifeExp, na.rm = TRUE)
[1] 4.285506

changing variables into the same direction

# Reverse Codierung
countryfacts$Homicide=scale(countryfacts$Homicide)
countryfacts$GDP=scale(-countryfacts$GDP)
countryfacts$InfMort=scale(countryfacts$InfMort)
countryfacts$LifeExp=scale(-countryfacts$LifeExp)
countryfacts$GINI=scale(countryfacts$GINI)
countryfacts$GenderPEdu=scale(-countryfacts$GenderPEdu)

countryfacts
# IMPUTE hardship indicators w/ median
for (counter in 4:9)
{
  countryfacts[is.na(countryfacts[,counter]),counter]=median(countryfacts[,counter],na.rm=TRUE)
}
countryfacts

Create the ‘hardship’ column in the ‘hardship’ data frame

countryfacts$hardship <- rowMeans(countryfacts[, c("Homicide", "GDP", "GINI", "LifeExp", "InfMort", "GenderPEdu")], na.rm = TRUE)

countryfacts

Control the data

mean(countryfacts$Homicide, na.rm = TRUE)
[1] 0.005702554
mean(countryfacts$GDP, na.rm = TRUE)
[1] -0.001846521
mean(countryfacts$LifeExp, na.rm = TRUE)
[1] -0.003187438

Plot histogram of all hardship indicators after log transform

# Plot histogram of all hardship indicators after log transform
# Leeres Plot-Objekt erstellen
combined_plot <- NULL

# Define the vector of labels for the items
items <- c("Homicide", "GDP", "GINI", "LifeExp", "InfMort", "GenderPEdu", "hardship")

# Loop durch jedes Item und füge das Histogramm zum kombinierten Plot hinzu
for (item in items) {
  # Erstelle ein Histogramm für das aktuelle Item
  plot <- ggplot(countryfacts, aes_string(x = item)) +
    geom_histogram(binwidth = 1, fill = "skyblue", color = "black") +
    labs(title = paste(item),
         x = item,
         y = "Frequency") +
    theme_minimal()
  
  # Füge das Histogramm zum kombinierten Plot hinzu
  if (is.null(combined_plot)) {
    combined_plot <- plot
  } else {
    combined_plot <- combined_plot + plot
  }
}

# Zeige den kombinierten Plot an
combined_plot

SUP MATERIALS:Correlation between hardship indicators

panel.cor = function(x, y, digits = 2, ...)
{
  usr = par("usr"); on.exit(par(usr))
  par(usr = c(0, 1, 0, 1))
  # correlation coefficient
  r = cor(x, y,use="complete.obs")
  txt = format(c(r, 0.123456789), digits = digits)[1]
  txt = paste("r= ", txt, sep = "")
  text(0.5, 0.6, txt)
  
  # p-value calculation
  p = cor.test(x, y,use="complete.obs")$p.value
  txt2 = format(c(p, 0.123456789), digits = digits)[1]
  txt2 = paste("p= ", txt2, sep = "")
  if(p<0.01) txt2 = paste("p ", "<0.01", sep = "")
  text(0.5, 0.4, txt2)
}
pairs(countryfacts[,4:10], upper.panel = panel.cor,las=1,cex.labels=.9) 

dev.print(postscript,"scatter_indicators.eps",width=8, height=8,horizontal=FALSE,onefile=FALSE)
quartz_off_screen 
                2 

Cronbach’s Alpha for Hardship Indicators

library(psych)

# Subset der Hardship-Indikatoren aus dem countryfacts-Datensatz auswählen
hardship_subset <- countryfacts[, c("Homicide", "GDP", "InfMort", "LifeExp", "GINI", "GenderPEdu")]

# Cronbach's Alpha berechnen
alpha_result <- alpha(hardship_subset)
Number of categories should be increased  in order to count frequencies. 
alpha_result

Reliability analysis   
Call: alpha(x = hardship_subset)

 

    95% confidence boundaries 

 Reliability if an item is dropped:

 Item statistics 
# Ersetzen Sie "USA" durch "United States" im countryfacts-Datensatz
countryfacts$country[countryfacts$country == "USA"] <- "United States"

Merge the data matrix with the countryfacts dataset based on the country code

# Zusammenführen der 'hardship'-Variable von countryfacts mit WVS_data basierend auf dem Ländernamen
WVS_data <- merge(WVS_data, countryfacts[, c("country", "hardship")], by = "country", all.x = TRUE)

# Kontrolle des Zusammengeführten Datensatzes
head(WVS_data)

#Transformation of item risktaking

WVS_data$risktaking = 6 - WVS_data$risktaking + 1

Risktaking as ordinal variable

# Define intervals for risktaking
interval <- cut(WVS_data$risktaking, breaks = c(-Inf, 1, 3, 5, Inf), labels = c("Very Low", "Low", "Medium", "High"), include.lowest = TRUE)

# Add the ordinal variable "Risktaking_ordinal" to the data frame
WVS_data$Risktaking_ordinal <- as.factor(interval)

# Display the updated data matrix
print(WVS_data)

Transform risk variable into T-score (mean = 50, sd = 10)

WVS_data$T_score_risktaking = 10*scale(WVS_data$risktaking, center=TRUE,scale=TRUE)+50

#Transform risk variable into Z score 
# Assuming T-scores have a mean of 50 and a standard deviation of 10
#WVS_data$Z_score_risktaking = (WVS_data$T_score_risktaking - 50) / 10

# Print the resulting data frame
#print(WVS_data)

#WVS_data <- WVS_data %>%
#  group_by(country) %>%
#  mutate(z_score_age = scale(age))
WVS_data

Check Laura on Items #########

length(unique(WVS_data$country))
[1] 77
nrow(WVS_data)
[1] 149626
range(WVS_data$age, na.rm = TRUE)
[1] 15 99
table(WVS_data$gender)

    0     1 
71689 77937 
table(WVS_data$children)

     0      1 
 44434 105192 
table(WVS_data$married)

    0     1 
66354 83272 
table(WVS_data$employed)

    0     1 
69519 80107 
table(WVS_data$education)

     0      1 
 38011 111615 
mean(WVS_data$T_score_risktaking)
[1] 50
mean(WVS_data$age)
[1] 41.59569

MIXED-MODELS WVS-DATA ####################

Mixed-model WVS - Replication of Mata et al., 2016

intercept only model

model0 = lmer(risktaking ~ 1 + (1|country),data = WVS_data)
summary_model0=summary(model0)

age, sex

model1 <- lmer(risktaking ~ 1 + scale(age) + factor(gender) + (1 + scale(age) + factor(gender) | country), 
               data = WVS_data, 
                      control = lmerControl(optimizer = "bobyqa"))
summary_model1=summary(model1)
print(summary_model1) # Koeffizientenübersicht des Modells anzeigen
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: risktaking ~ 1 + scale(age) + factor(gender) + (1 + scale(age) +      factor(gender) | country)
   Data: WVS_data
Control: lmerControl(optimizer = "bobyqa")

REML criterion at convergence: 539930.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.4750 -0.7820 -0.0772  0.7523  3.2237 

Random effects:
 Groups   Name            Variance Std.Dev. Corr     
 country  (Intercept)     0.16689  0.4085            
          scale(age)      0.01956  0.1399   0.31     
          factor(gender)1 0.02207  0.1486   0.12 0.25
 Residual                 2.15081  1.4666            
Number of obs: 149626, groups:  country, 77

Fixed effects:
                Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)      3.42058    0.04697 76.22138   72.83   <2e-16 ***
scale(age)      -0.32274    0.01658 74.09940  -19.46   <2e-16 ***
factor(gender)1 -0.36831    0.01887 73.38879  -19.52   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) scl(g)
scale(age)  0.296        
fctr(gndr)1 0.067  0.222 

Summary model1

summary_model1 <- summary(model1)

# Gewünschte Werte extrahieren und formatieren
results_model1 <- data.frame(
  Predictor = c("Intercept", "Age", "Gender"),
  Estimate = c(summary_model1$coefficients["(Intercept)", "Estimate"],
               summary_model1$coefficients["scale(age)", "Estimate"],
               summary_model1$coefficients["factor(gender)1", "Estimate"]),
  SE = c(summary_model1$coefficients["(Intercept)", "Std. Error"],
          summary_model1$coefficients["scale(age)", "Std. Error"],
          summary_model1$coefficients["factor(gender)1", "Std. Error"]),
  T_score = c(summary_model1$coefficients["(Intercept)", "t value"],
              summary_model1$coefficients["scale(age)", "t value"],
              summary_model1$coefficients["factor(gender)1", "t value"]),
  p_value = c(summary_model1$coefficients["(Intercept)", "Pr(>|t|)"],
              summary_model1$coefficients["scale(age)", "Pr(>|t|)"],
              summary_model1$coefficients["factor(gender)1", "Pr(>|t|)"])
)

# p-Values
results_model1$p_value <- ifelse(results_model1$p_value < 0.001, "< .001", sprintf("%.3f", results_model1$p_value))

print(results_model1)

age, sex, and covariates (children, marital status, employement status, education)

model2 = lmer(risktaking ~ 1+scale(age)+factor(gender) + factor(children) + factor(married) + factor(employed) + factor(education)+ (1+scale(age)+factor(gender)+ factor(children) + factor(married) + factor(employed) + factor(education)|country),data = WVS_data,control=lmerControl(optCtrl=list(maxfun=30000),optimizer="bobyqa"))
summary_model2=summary(model2)

print(summary_model2) 
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: risktaking ~ 1 + scale(age) + factor(gender) + factor(children) +  
    factor(married) + factor(employed) + factor(education) +  
    (1 + scale(age) + factor(gender) + factor(children) + factor(married) +  
        factor(employed) + factor(education) | country)
   Data: WVS_data
Control: lmerControl(optCtrl = list(maxfun = 30000), optimizer = "bobyqa")

REML criterion at convergence: 538463.9

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.56649 -0.78106 -0.08451  0.74253  3.15001 

Random effects:
 Groups   Name               Variance Std.Dev. Corr                               
 country  (Intercept)        0.139152 0.37303                                     
          scale(age)         0.013141 0.11464   0.23                              
          factor(gender)1    0.023395 0.15295   0.00  0.25                        
          factor(children)1  0.021111 0.14530   0.09  0.17  0.08                  
          factor(married)1   0.010402 0.10199   0.18  0.45  0.54  0.25            
          factor(employed)1  0.007348 0.08572   0.01  0.06  0.03 -0.29 -0.23      
          factor(education)1 0.015081 0.12281  -0.17  0.07  0.10 -0.15  0.08  0.19
 Residual                    2.125987 1.45808                                     
Number of obs: 149626, groups:  country, 77

Fixed effects:
                   Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)         3.52589    0.04496 77.42844  78.415  < 2e-16 ***
scale(age)         -0.23515    0.01418 72.33362 -16.584  < 2e-16 ***
factor(gender)1    -0.34507    0.01948 73.82618 -17.718  < 2e-16 ***
factor(children)1  -0.20808    0.02069 72.08694 -10.056 2.30e-15 ***
factor(married)1   -0.13608    0.01562 62.66677  -8.712 2.13e-12 ***
factor(employed)1   0.01736    0.01331 68.39340   1.304    0.197    
factor(education)1  0.12489    0.01869 51.44582   6.683 1.66e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) scl(g) fctr(g)1 fctr(c)1 fctr(mr)1 fctr(mp)1
scale(age)   0.202                                             
fctr(gndr)1 -0.048  0.223                                      
fctr(chld)1  0.001  0.029  0.015                               
fctr(mrrd)1  0.104  0.308  0.386   -0.049                      
fctr(mply)1 -0.055  0.083  0.088   -0.209   -0.154             
fctr(dctn)1 -0.263  0.106  0.074   -0.081    0.036     0.065   

Summary model2

summary_model2 <- summary(model2)

# Gewünschte Werte extrahieren und formatieren
results_model2 <- data.frame(
  Predictor = c("Intercept", "Age", "Gender", "Parental status", "Marital status", "Occupational status", "Education"),
  Estimate = c(summary_model2$coefficients["(Intercept)", "Estimate"],
               summary_model2$coefficients["scale(age)", "Estimate"],
               summary_model2$coefficients["factor(gender)1", "Estimate"],
               summary_model2$coefficients["factor(children)1", "Estimate"],
               summary_model2$coefficients["factor(married)1", "Estimate"],
               summary_model2$coefficients["factor(employed)1", "Estimate"],
               summary_model2$coefficients["factor(education)1", "Estimate"]),
  SE = c(summary_model2$coefficients["(Intercept)", "Std. Error"],
          summary_model2$coefficients["scale(age)", "Std. Error"],
          summary_model2$coefficients["factor(gender)1", "Std. Error"],
          summary_model2$coefficients["factor(children)1", "Std. Error"],
          summary_model2$coefficients["factor(married)1", "Std. Error"],
          summary_model2$coefficients["factor(employed)1", "Std. Error"],
          summary_model2$coefficients["factor(education)1", "Std. Error"]),
  T_score = c(summary_model2$coefficients["(Intercept)", "t value"],
              summary_model2$coefficients["scale(age)", "t value"],
              summary_model2$coefficients["factor(gender)1", "t value"],
              summary_model2$coefficients["factor(children)1", "t value"],
              summary_model2$coefficients["factor(married)1", "t value"],
              summary_model2$coefficients["factor(employed)1", "t value"],
              summary_model2$coefficients["factor(education)1", "t value"]),
  p_value = c(summary_model2$coefficients["(Intercept)", "Pr(>|t|)"],
              summary_model2$coefficients["scale(age)", "Pr(>|t|)"],
              summary_model2$coefficients["factor(gender)1", "Pr(>|t|)"],
              summary_model2$coefficients["factor(children)1", "Pr(>|t|)"],
              summary_model2$coefficients["factor(married)1", "Pr(>|t|)"],
              summary_model2$coefficients["factor(employed)1", "Pr(>|t|)"],
              summary_model2$coefficients["factor(education)1", "Pr(>|t|)"])
)

# p-Values
results_model2$p_value <- ifelse(results_model2$p_value < 0.001, "< .001", sprintf("%.3f", results_model2$p_value))

print(results_model2)
model3 <- lmer(risktaking ~ 1+scale(age)*hardship+factor(gender)*hardship + factor(children) + factor(married) + factor(employed) + factor(education)+ (1+scale(age)+factor(gender)+ factor(children) + factor(married) + factor(employed) + factor(education)|country),data = WVS_data,control=lmerControl(optCtrl=list(maxfun=30000),optimizer="bobyqa"),REML = FALSE)
summary_model3=summary(model3)

print(summary_model3)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: risktaking ~ 1 + scale(age) * hardship + factor(gender) * hardship +  
    factor(children) + factor(married) + factor(employed) + factor(education) +  
    (1 + scale(age) + factor(gender) + factor(children) + factor(married) +  
        factor(employed) + factor(education) | country)
   Data: WVS_data
Control: lmerControl(optCtrl = list(maxfun = 30000), optimizer = "bobyqa")

      AIC       BIC    logLik  deviance  df.resid 
 506676.3  507060.7 -253299.1  506598.3    140899 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.5689 -0.7802 -0.0814  0.7397  3.1587 

Random effects:
 Groups   Name               Variance Std.Dev. Corr                               
 country  (Intercept)        0.143188 0.37840                                     
          scale(age)         0.011997 0.10953   0.25                              
          factor(gender)1    0.018302 0.13528   0.04  0.08                        
          factor(children)1  0.019692 0.14033   0.12  0.12  0.04                  
          factor(married)1   0.008165 0.09036   0.38  0.30  0.36  0.24            
          factor(employed)1  0.007840 0.08855  -0.04  0.15  0.09 -0.27 -0.16      
          factor(education)1 0.013980 0.11824  -0.17  0.10 -0.05 -0.16  0.11  0.18
 Residual                    2.117988 1.45533                                     
Number of obs: 140938, groups:  country, 71

Fixed effects:
                         Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)               3.52598    0.04742 70.65620  74.351  < 2e-16 ***
scale(age)               -0.23350    0.01420 66.90661 -16.447  < 2e-16 ***
hardship                 -0.02124    0.05643 69.58929  -0.376  0.70776    
factor(gender)1          -0.33971    0.01839 64.47497 -18.474  < 2e-16 ***
factor(children)1        -0.20928    0.02095 67.91734  -9.991 5.74e-15 ***
factor(married)1         -0.13235    0.01513 60.47161  -8.749 2.46e-12 ***
factor(employed)1         0.01692    0.01409 63.41965   1.202  0.23399    
factor(education)1        0.12794    0.01900 49.53716   6.733 1.64e-08 ***
scale(age):hardship       0.04544    0.01753 66.92025   2.592  0.01172 *  
hardship:factor(gender)1  0.06868    0.02241 65.02969   3.064  0.00317 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) scl(g) hrdshp fctr(g)1 fctr(c)1 fctr(mr)1 fctr(mp)1 fctr(d)1 scl():
scale(age)   0.225                                                                    
hardship    -0.034  0.010                                                             
fctr(gndr)1 -0.022  0.085  0.007                                                      
fctr(chld)1  0.025 -0.011 -0.002 -0.016                                               
fctr(mrrd)1  0.231  0.190 -0.008  0.249   -0.073                                      
fctr(mply)1 -0.086  0.146  0.005  0.131   -0.204   -0.117                             
fctr(dctn)1 -0.262  0.126  0.011 -0.028   -0.085    0.049     0.057                   
scl(g):hrds  0.009 -0.014  0.253  0.000    0.005   -0.009    -0.031    -0.001         
hrdshp:f()1  0.007  0.007 -0.086 -0.030   -0.003   -0.013     0.019    -0.005    0.023

Summary model3

# Zusammenfassung des Modells anzeigen
summary_model3 <- summary(model3)

# Gewünschte Werte extrahieren und formatieren
results_model3 <- data.frame(
  Predictor = c("Intercept", "Age", "Gender", "Parental status", "Marital status", "Occupational status", "Education", "Hardship", "Interaction: Gender * Hardship"),
  Estimate = c(summary_model3$coefficients["(Intercept)", "Estimate"],
               summary_model3$coefficients["scale(z_score_age)", "Estimate"],
               summary_model3$coefficients["factor(gender)1", "Estimate"],
               summary_model3$coefficients["factor(children)1", "Estimate"],
               summary_model3$coefficients["factor(married)1", "Estimate"],
               summary_model3$coefficients["factor(employed)1", "Estimate"],
               summary_model3$coefficients["factor(education)1", "Estimate"],
               summary_model3$coefficients["hardship", "Estimate"],
               summary_model3$coefficients["hardship:factor(gender)1", "Estimate"]),
  SE = c(summary_model3$coefficients["(Intercept)", "Std. Error"],
          summary_model3$coefficients["scale(z_score_age)", "Std. Error"],
          summary_model3$coefficients["factor(gender)1", "Std. Error"],
          summary_model3$coefficients["factor(children)1", "Std. Error"],
          summary_model3$coefficients["factor(married)1", "Std. Error"],
          summary_model3$coefficients["factor(employed)1", "Std. Error"],
          summary_model3$coefficients["factor(education)1", "Std. Error"],
          summary_model3$coefficients["hardship", "Std. Error"],
          summary_model3$coefficients["hardship:factor(gender)1", "Std. Error"]),
  T_score = c(summary_model3$coefficients["(Intercept)", "t value"],
              summary_model3$coefficients["scale(z_score_age)", "t value"],
              summary_model3$coefficients["factor(gender)1", "t value"],
              summary_model3$coefficients["factor(children)1", "t value"],
              summary_model3$coefficients["factor(married)1", "t value"],
              summary_model3$coefficients["factor(employed)1", "t value"],
              summary_model3$coefficients["factor(education)1", "t value"],
              summary_model3$coefficients["hardship", "t value"],
              summary_model3$coefficients["hardship:factor(gender)1", "t value"]),
  p_value = c(summary_model3$coefficients["(Intercept)", "Pr(>|t|)"],
              summary_model3$coefficients["scale(z_score_age)", "Pr(>|t|)"],
              summary_model3$coefficients["factor(gender)1", "Pr(>|t|)"],
              summary_model3$coefficients["factor(children)1", "Pr(>|t|)"],
              summary_model3$coefficients["factor(married)1", "Pr(>|t|)"],
              summary_model3$coefficients["factor(employed)1", "Pr(>|t|)"],
              summary_model3$coefficients["factor(education)1", "Pr(>|t|)"],
              summary_model3$coefficients["hardship", "Pr(>|t|)"],
              summary_model3$coefficients["hardship:factor(gender)1", "Pr(>|t|)"])
)

# Formatierung der p-Werte
results_model3$p_value <- ifelse(results_model3$p_value < 0.001, "< .001", sprintf("%.3f", results_model3$p_value))

# Ergebnisse anzeigen
print(results_model3)

ANOVA

anova(model0,model1)
refitting model(s) with ML (instead of REML)
Data: WVS_data
Models:
model0: risktaking ~ 1 + (1 | country)
model1: risktaking ~ 1 + scale(age) + factor(gender) + (1 + scale(age) + factor(gender) | country)
       npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)    
model0    3 549268 549298 -274631   549262                         
model1   10 539934 540033 -269957   539914 9348.1  7  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
anova(model1,model2)
refitting model(s) with ML (instead of REML)
Data: WVS_data
Models:
model1: risktaking ~ 1 + scale(age) + factor(gender) + (1 + scale(age) + factor(gender) | country)
model2: risktaking ~ 1 + scale(age) + factor(gender) + factor(children) + factor(married) + factor(employed) + factor(education) + (1 + scale(age) + factor(gender) + factor(children) + factor(married) + factor(employed) + factor(education) | country)
       npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)    
model1   10 539934 540033 -269957   539914                         
model2   36 538493 538850 -269210   538421 1492.9 26  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
anova(model2,model3) 
Error in anova.merMod(model2, model3) : 
  models were not all fitted to the same size of dataset
WVS_data
coefsallmodels=rbind(summary_model1$coefficients,
summary_model2$coefficients,
summary_model3$coefficients[c(1:2,4:8,3,9:10),])

write.csv(coefsallmodels,"coefsallmodels.csv")

Delete when submitting the code –> just for me to know where the document is

# Check the data merging process
merging_process <- "Insert code to check data merging process"

# Display the merging process
print(merging_process)
[1] "Insert code to check data merging process"
# Extrahieren der Koeffizienten-Tabelle für jedes Modell
coefficients_model0 <- summary(model0)$coefficients
coefficients_model1 <- summary(model1)$coefficients
coefficients_model2 <- summary(model2)$coefficients
coefficients_model3 <- summary(model3)$coefficients

# Filtern der erforderlichen Zeilen aus den Koeffizienten
coefficients_model0 <- coefficients_model0[rownames(coefficients_model0) %in% c("(Intercept)", "scale(z_score_age)", "factor(gender)"), ]
coefficients_model1 <- coefficients_model1[rownames(coefficients_model1) %in% c("(Intercept)", "scale(z_score_age)", "factor(gender)"), ]
coefficients_model2 <- coefficients_model2[rownames(coefficients_model2) %in% c("(Intercept)", "scale(z_score_age)", "factor(gender)", "factor(children)", "factor(married)", "factor(employed)", "factor(education)"), ]
coefficients_model3 <- coefficients_model3[rownames(coefficients_model3) %in% c("(Intercept)", "scale(z_score_age)", "factor(gender)", "factor(children)", "factor(married)", "factor(employed)", "factor(education)", "hardship", "scale(z_score_age):hardship", "factor(gender):hardship"), ]

# Zusammenführen der geschätzten Koeffizienten aus allen Modellen
coefs_all_models <- rbind(coefficients_model0, coefficients_model1, coefficients_model2, coefficients_model3)

# Erstellen einer Tabelle aus den Koeffizienten
results_table <- data.frame(
  Predictor = rownames(coefs_all_models),
  b = coefs_all_models[, "Estimate"],
  SE = coefs_all_models[, "Std. Error"],
  T_score = coefs_all_models[, "t value"],
  p_value = coefs_all_models[, "Pr(>|t|)"]
)

# Drucken der Ergebnistabelle
results_table
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CnJtKGxpc3QgPSBscygpKQpgYGAKCgojIExpYnJhcmllcwpgYGB7cn0KbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KG1hcHMpCmxpYnJhcnkoaGF2ZW4pCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoZ2dyZXBlbCkKbGlicmFyeSh3b3JkY2xvdWQpCmxpYnJhcnkobG1lNCkKbGlicmFyeShsbWVyVGVzdCkKbGlicmFyeShyZXNoYXBlMikKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkocHN5Y2gpCmBgYAoKIyMjIyMjIyMjIyMjIyMjIyMjIyMKUFJFUCBUSEUgREFUQVNFVCBGT1IgQU5BTFlTSVMgV1ZTIDUgJiA2CiMjIyMjIyMjIyMjIyMjIyMjIyMjCgojcmVhZCB0aGUgZGF0YSAoV2F2ZSA1KQpgYGB7cn0KIyBEYXRhIG9mIFdhdmUgNQpXVjVfZGF0YSA8LSByZWFkUkRTKCIvVXNlcnMvbGF1cmFiYXp6aWdoZXIvRG9jdW1lbnRzL0dpdEh1Yi9yaXNrX3d2cy9kYXRhL2RhdGFzZXQvV1Y2X2RhdGFzZXRfd2F2ZV81XzYvRjAwMDA3OTQ0LVdWNV9EYXRhX1JfdjIwMTgwOTEyLnJkcyIpCgojIENvbnZlcnQgV1Y1X2RhdGEtb2JqZWN0IGluIGRhdGEuZnJhbWUgCldWNV9kYXRhX2RmIDwtIGFzLmRhdGEuZnJhbWUoV1Y1X2RhdGEpCgojIHNob3cgZmlyc3QgZml2ZSBjb2x1bW5zCldWNV9kYXRhX2RmCmBgYAoKIyBjbGVhbiB0aGUgZGF0YSBzZXQKYGBge3J9CiNyZW5hbWUgdGhlIHZhcmlhYmxlcwpXVjVfZGF0YSA8LSBXVjVfZGF0YV9kZiAlPiUKICByZW5hbWUoZ2VuZGVyID0gVjIzNSwgYWdlID0gVjIzNywgY291bnRyeV9jb2RlID0gVjIsIHdhdmUgPSBWMSwgcmlza3Rha2luZyA9IFY4NiwgY2hpbGRyZW4gPSBWNTYsIG1hcnJpZWQgPSBWNTUsIGVtcGxveWVkID0gVjI0MSwgZWR1Y2F0aW9uID0gVjIzOCkKV1Y1X2RhdGEKCmNvbG5hbWVzKFdWNV9kYXRhKQoKI3NlbGVjdCBvbmx5IHRoZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3QKV1Y1X2RhdGEgPC0gV1Y1X2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdChnZW5kZXIsIGFnZSwgY291bnRyeV9jb2RlLCB3YXZlLCByaXNrdGFraW5nLCBjaGlsZHJlbiwgZW1wbG95ZWQsIGVkdWNhdGlvbiwgbWFycmllZCkKV1Y1X2RhdGEKYGBgCiMgUmVhZCBjb3VudHJ5bmFtZXMgZGF0YSBmcm9tIHRoZSBDU1YgZmlsZSAodG8gZGVjb2RlIHRoZSBkYXRhc2V0IDUpCmBgYHtyfQpjb3VudHJ5bmFtZXMgPC0gcmVhZC5jc3YoIi9Vc2Vycy9sYXVyYWJhenppZ2hlci9Eb2N1bWVudHMvR2l0SHViL3Jpc2tfd3ZzL2RhdGEvZGF0YXNldC9XVjZfZGF0YXNldF93YXZlXzVfNi9jb3VudHJ5bmFtZXMudHh0IiwgaGVhZGVyID0gRkFMU0UsIGFzLmlzID0gVFJVRSkKY29sbmFtZXMoY291bnRyeW5hbWVzKSA8LSBjKCJjb2RlIiwgIm5hbWUiKQoKIyBBc3N1bWluZyBXVjVfZGF0YSBoYXMgYSBjb2x1bW4gbmFtZWQgY291bnRyeV9jb2RlCldWNV9kYXRhJGNvdW50cnkgPC0gY291bnRyeW5hbWVzJG5hbWVbbWF0Y2goV1Y1X2RhdGEkY291bnRyeV9jb2RlLCBjb3VudHJ5bmFtZXMkY29kZSldCgojIENoZWNrIHRoZSBmcmVxdWVuY3kgb2YgZWFjaCBjb3VudHJ5IGluIHRoZSBuZXcgY29sdW1uCnRhYmxlKFdWNV9kYXRhJGNvdW50cnkpCgojIERpc3BsYXkgdGhlIHVwZGF0ZWQgV1Y1X2RhdGEKcHJpbnQoV1Y1X2RhdGEpCmBgYAoKI1JlYWQgRGF0YXNldCAoV2F2ZSA2KQpgYGB7cn0KbG9hZCgiL1VzZXJzL2xhdXJhYmF6emlnaGVyL0RvY3VtZW50cy9HaXRIdWIvcmlza193dnMvZGF0YS9kYXRhc2V0L1dWNl9kYXRhc2V0X3dhdmVfNV82L1dWNl9EYXRhX1JfdjIwMjAxMTE3LnJkYXRhIikgCldWNl9kYXRhIDwtIFdWNl9EYXRhX1JfdjIwMjAxMTE3IAoKcHJpbnQoV1Y2X2RhdGEpCmBgYAojcmVuYW1lIHZhcmlhYmxlcwpgYGB7cn0KV1Y2X2RhdGEgPC0gV1Y2X2RhdGEgJT4lCiAgcmVuYW1lKHdhdmUgPSBWMSwgZ2VuZGVyID0gVjI0MCwgYWdlID0gVjI0Mixjb3VudHJ5X2NvZGUgPSBWMiwgcmlza3Rha2luZyA9IFY3NiwgY2hpbGRyZW4gPSBWNTgsIG1hcnJpZWQgPSBWNTcsIGVtcGxveWVkID0gVjIyOSwgZWR1Y2F0aW9uID0gVjI0OCkKCiNzZWxlY3Qgb25seSB0aGUgdmFyaWFibGVzIG9mIGludGVyZXN0CldWNl9kYXRhIDwtIFdWNl9kYXRhICU+JQogIGRwbHlyOjpzZWxlY3QoZ2VuZGVyLCBhZ2UsIGNvdW50cnlfY29kZSwgd2F2ZSwgcmlza3Rha2luZywgY2hpbGRyZW4sIGVtcGxveWVkLCBlZHVjYXRpb24sIG1hcnJpZWQpCldWNl9kYXRhCmBgYAojZGVjb2RlIGRhcmFzZXQgKFdhdmUgNikKYGBge3J9CmNvdW50cnluYW1lcyA9IHJlYWQuY3N2KCIvVXNlcnMvbGF1cmFiYXp6aWdoZXIvRG9jdW1lbnRzL0dpdEh1Yi9yaXNrX3d2cy9kYXRhL2RhdGFzZXQvV1Y2X2RhdGFzZXRfd2F2ZV81XzYvY291bnRyeW5hbWVzLnR4dCIsIGhlYWRlcj1GQUxTRSxhcy5pcz1UUlVFKQpjb2xuYW1lcyhjb3VudHJ5bmFtZXMpID0gYygiY29kZSIsICJuYW1lIikKV1Y2X2RhdGEkY291bnRyeSA9IGNvdW50cnluYW1lcyRuYW1lIFttYXRjaChXVjZfZGF0YSRjb3VudHJ5X2NvZGUsIGNvdW50cnluYW1lcyRjb2RlKV0KdGFibGUoV1Y2X2RhdGEkY291bnRyeSkKV1Y2X2RhdGEKYGBgCgojY29tYmluZSB0aGUgMiBkYXRhc2V0IChXYXZlIDYgKyBXYXZlIDUpCmBgYHtyfQpXVlNfZGF0YSA9IHJiaW5kKFdWNV9kYXRhLCBXVjZfZGF0YSkKV1ZTX2RhdGEKYGBgCgojZXhjbHVzaW9uIG9mIHBhcnRpY2lwYW50cyBhbmQgb21pc3Npb24gb2YgbWlzc2luZyBkYXRhIChuYSkKYGBge3J9CldWU19kYXRhID0gc3Vic2V0KFdWU19kYXRhLCByaXNrdGFraW5nID4gMCAmIGdlbmRlciA+IDAgJiBhZ2UgPjAgJiBlZHVjYXRpb24gPiAwICYgZW1wbG95ZWQgPiAwICYgbWFycmllZCA+IDAgJiBjaGlsZHJlbiA+PSAwKQojIyMgV1ZTX2RhdGEgPC0gbmEub21pdChXVlNfZGF0YSkgIyMjIGV4Y2x1ZGVkIGJlY2F1c2UgaXQgaXMgbm90IGluIGNvZGUgZnJvbSBNYXRhIGV0IGFsLiwgMjAxNgoKIyBVc2UgdGhlIG11dGF0ZSBmdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGNvdW50cnkgbmFtZQpXVlNfZGF0YSA8LSBXVlNfZGF0YSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGlmZWxzZShjb3VudHJ5ID09ICJHcmVhdCBCcml0YWluIiwgIlVuaXRlZCBLaW5nZG9tIiwgY291bnRyeSkpCmBgYAoKYGBge3J9CmhlYWQoV1ZTX2RhdGEpCmBgYAoKIyBjb250cm9sbCBkYXRhCmBgYHtyfQpsZW5ndGgodW5pcXVlKFdWU19kYXRhJGNvdW50cnkpKSAKbnJvdyhXVlNfZGF0YSkgIyBudW1iZXIgb2YgaW5kaXZpZHVhbHMgCnJhbmdlKFdWU19kYXRhJGFnZSwgbmEucm09VFJVRSkgCnRhYmxlKFdWU19kYXRhJGdlbmRlcikgIyBzZXggdGFibGUoZGF0YSRzZXgpL25yb3coZGF0YSkgCmBgYAoKIyBjcmVhdGUgYSBjYXRlZ29yaWNhbCBhZ2UgdmFyaWFibGUgKGZvciBleGFtcGxlLCB0byBwbG90IHJlc3BvbnNlIGZyZXF1ZW5jaWVzIGJ5IGNhdGVnb3J5KQpgYGB7cn0KV1ZTX2RhdGEkYWdlY2F0W1dWU19kYXRhJGFnZTwyMF09IjE1LTE5IgpXVlNfZGF0YSRhZ2VjYXRbV1ZTX2RhdGEkYWdlPj0yMCAmIFdWU19kYXRhJGFnZSA8MzBdID0gIjIwLTI5IgpXVlNfZGF0YSRhZ2VjYXRbV1ZTX2RhdGEkYWdlPj0zMCAmIFdWU19kYXRhJGFnZSA8NDBdID0gIjMwLTM5IgpXVlNfZGF0YSRhZ2VjYXRbV1ZTX2RhdGEkYWdlPj00MCAmIFdWU19kYXRhJGFnZSA8NTBdID0gIjQwLTQ5IgpXVlNfZGF0YSRhZ2VjYXRbV1ZTX2RhdGEkYWdlPj01MCAmIFdWU19kYXRhJGFnZSA8NjBdID0gIjUwLTU5IgpXVlNfZGF0YSRhZ2VjYXRbV1ZTX2RhdGEkYWdlPj02MCAmIFdWU19kYXRhJGFnZSA8NzBdID0gIjYwLTY5IgpXVlNfZGF0YSRhZ2VjYXRbV1ZTX2RhdGEkYWdlPj03MCAmIFdWU19kYXRhJGFnZSA8ODBdID0gIjcwLTc5IgpXVlNfZGF0YSRhZ2VjYXRbV1ZTX2RhdGEkYWdlPj04MF0gPSAiODArIgoKdGFibGUoV1ZTX2RhdGEkYWdlKQp0YWJsZShXVlNfZGF0YSRhZ2VjYXQpCmBgYAoKIyBjcmVhdGUgYSBjYXRlZ29yaWNhbCBlZHVjYXRpb24gdmFyaWFibGUgKHdpdGggZmV3ZXIgY2F0ZWdvcmllcyB0aGFuIHRoZSBvcmlnaW5hbCkKYGBge3J9CiMgTmV1ZSBTcGFsdGUgJ2VkdWNhdGlvbl9jYXQnIGVyc3RlbGxlbiB1bmQgaW5pdGlhbGlzaWVyZW4KV1ZTX2RhdGEkZWR1Y2F0aW9uX2NhdCA8LSBOQQoKIyBLYXRlZ29yaWVuIHp1d2Vpc2VuIGJhc2llcmVuZCBhdWYgZGVuIEJpbGR1bmdzc3R1ZmVuCldWU19kYXRhJGVkdWNhdGlvbl9jYXQgPC0gaWZlbHNlKFdWU19kYXRhJGVkdWNhdGlvbiAlaW4lIGMoMSwgMiksICJpbmNvbXBsZXRlIG9yIG5vIHByaW1hcnkgZWR1Y2F0aW9uIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFdWU19kYXRhJGVkdWNhdGlvbiAlaW4lIGMoMywgNCwgNSwgNiksICJObyBVbmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShXVlNfZGF0YSRlZHVjYXRpb24gJWluJSBjKDcsIDgsIDkpLCAiVW5pIiwgTkEpKSkKCiMgVGFiZWxsZSBkZXIgbmV1ZW4gS2F0ZWdvcmllbiBhbnplaWdlbgp0YWJsZShXVlNfZGF0YSRlZHVjYXRpb25fY2F0KQpgYGAKCiMgRGljaG90b21pemluZyBWYXJpYWJsZXM6IFRoaXMgaGVscHMgZXN0aW1hdGluZyBhbmQgaW50ZXJwcmV0aW5nIHRoZSBtb2RlbHMgbGF0ZXIgb24uLi4KYGBge3J9CldWU19kYXRhJGdlbmRlciA9IGlmZWxzZShXVlNfZGF0YSRnZW5kZXIgPT0gMSwgMCwgMSkgIyBzZXg6IG1hbGUgdnMuIGZlbWFsZQpXVlNfZGF0YSRjaGlsZHJlbiA9IGlmZWxzZShXVlNfZGF0YSRjaGlsZHJlbiA9PSAwLCAwLCAxKSAjIGNoaWxkcmVuOiBubyB2cy4geWVzCldWU19kYXRhJG1hcnJpZWQgPSBpZmVsc2UoV1ZTX2RhdGEkbWFycmllZCA9PSAxLCAxLCAwKSAjIG1hcnJpZWQ6IHllcyB2cy4gbm8KV1ZTX2RhdGEkZW1wbG95ZWQgPSBpZmVsc2UoV1ZTX2RhdGEkZW1wbG95ZWQgPCA0LCAxLCAwKSAjIGVtcGxveWVkOiB5ZXMgdnMuIG5vCldWU19kYXRhJGVkdWNhdGlvbiA9IGlmZWxzZShXVlNfZGF0YSRlZHVjYXRpb24gPCA0LCAwLCAxKSAjIGVkdWNhdGlvbjogbm8gcHJpbWFyeSB2cy4gcHJpbWFyeSsgCmhlYWQoV1ZTX2RhdGEpCmBgYAojIENvbnRyb2wgdGhlIGRhdGEKYGBge3J9Cmxlbmd0aCh1bmlxdWUoV1ZTX2RhdGEkY291bnRyeSkpCm5yb3coV1ZTX2RhdGEpCnJhbmdlKFdWU19kYXRhJGFnZSkKdGFibGUoV1ZTX2RhdGEkZ2VuZGVyKQoKdGFibGUoV1ZTX2RhdGEkY2hpbGRyZW4pCnRhYmxlKFdWU19kYXRhJG1hcnJpZWQpCnRhYmxlKFdWU19kYXRhJGVtcGxveWVkKQp0YWJsZShXVlNfZGF0YSRlZHVjYXRpb24pCgptZWFuKFdWU19kYXRhJGFnZSkKbWVhbihXVlNfZGF0YSRyaXNrdGFraW5nKQpgYGAKCgojIyMjIyMjIyMjIyMjIyMjIyMjIwpQUkVQIFRIRSBEQVRBU0VUIEZPUiBBTkFMWVNJUyBIQVJEU0hJUAojIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyByZWFkIGluIGZpbGUgdGhhdCBjb250YWlucyBoYXJkc2hpcCBpbmRpY2F0b3JzIG1hbnVhbGx5IGNvbGxlY3RlZCBmcm9tIENJQSBmYWN0Ym9vaywgV0hPLCBhbmQgV29ybGQgQmFuayAKYGBge3J9CmNzdl9wYXRoIDwtICIvVXNlcnMvbGF1cmFiYXp6aWdoZXIvRG9jdW1lbnRzL0dpdEh1Yi9yaXNrX3d2cy9kYXRhL0RhdGFfTWF0YV9ldF9hbC5fMjAxNi9jb3VudHJ5ZmFjdHNfc2VsZWN0aW9uX25ldy5jc3YiCmNvdW50cnlmYWN0cyA8LSByZWFkLmNzdihjc3ZfcGF0aCwgYXMuaXMgPSBUUlVFLCBoZWFkZXIgPSBUUlVFKSAKCgpsYWJlbHM9YygiY29kZSIsImNvdW50cnkiLCJjb2RlV1ZTIiwiSG9taWNpZGUiLCJHRFAiLCJJbmZNb3J0IiwiTGlmZUV4cCIsIkdJTkkiLCJHZW5kZXJQRWR1IikKbmFtZXMoY291bnRyeWZhY3RzKT1sYWJlbHMKCm1pc3NpbmdzPWNvbFN1bXMoaXMubmEoY291bnRyeWZhY3RzWyw0OjldKSkvNzcgIyBwcm9wb3J0aW9uIG9mIG1pc3NpbmcgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBoYXJkc2hpcCBpbmRpY2F0b3JzCgp1bmlxdWUoV1ZTX2RhdGEkY291bnRyeV9jb2RlKSAlaW4lIGNvdW50cnlmYWN0cyRjb2RlV1ZTICMgY2hlY2sgdGhhdCBhbGwgY291bnRyaWVzIGluIHRoZSBzdWJzZXQgb2YgdGhlIFdWUyBkYXRhIGFyZSBpbmNsdWRlZCBpbiB0aGUgY291bnRyeWZhY3RzIGZpbGUKCmNvdW50cnlmYWN0cwpgYGAKCiMgQ29udHJvbCB0aGUgZGF0YQpgYGB7cn0KbWVhbihjb3VudHJ5ZmFjdHMkSG9taWNpZGUsIG5hLnJtID0gVFJVRSkKbWVhbihjb3VudHJ5ZmFjdHMkR0RQLCBuYS5ybSA9IFRSVUUpCm1lYW4oY291bnRyeWZhY3RzJExpZmVFeHAsIG5hLnJtID0gVFJVRSkKYGBgCgojIFBsb3QgaGlzdG9ncmFtIG9mIGFsbCBoYXJkc2hpcCBpbmRpY2F0b3JzCmBgYHtyfQojIFBsb3QgaGlzdG9ncmFtIG9mIGFsbCBoYXJkc2hpcCBpbmRpY2F0b3JzCmNvbWJpbmVkX3Bsb3QgPC0gTlVMTCAjIExlZXJlcyBQbG90LU9iamVrdCBlcnN0ZWxsZW4KCiMgRGVmaW5lIHRoZSB2ZWN0b3Igb2YgbGFiZWxzIGZvciB0aGUgaXRlbXMKaXRlbXMgPC0gYygiSG9taWNpZGUiLCJHRFAiLCJJbmZNb3J0IiwiTGlmZUV4cCIsIkdJTkkiLCJHZW5kZXJQRWR1IikKCiMgTG9vcCBkdXJjaCBqZWRlcyBJdGVtIHVuZCBmw7xnZSBkYXMgSGlzdG9ncmFtbSB6dW0ga29tYmluaWVydGVuIFBsb3QgaGluenUKZm9yIChpdGVtIGluIGl0ZW1zKSB7CiAgIyBFcnN0ZWxsZSBlaW4gSGlzdG9ncmFtbSBmw7xyIGRhcyBha3R1ZWxsZSBJdGVtCiAgcGxvdCA8LSBnZ3Bsb3QoY291bnRyeWZhY3RzLCBhZXNfc3RyaW5nKHggPSBpdGVtKSkgKwogICAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxLCBmaWxsID0gInNreWJsdWUiLCBjb2xvciA9ICJibGFjayIpICsKICAgIGxhYnModGl0bGUgPSBwYXN0ZShpdGVtKSwKICAgICAgICAgeCA9IGl0ZW0sCiAgICAgICAgIHkgPSAiRnJlcXVlbmN5IikgKwogICAgdGhlbWVfbWluaW1hbCgpCiAgCiAgIyBGw7xnZSBkYXMgSGlzdG9ncmFtbSB6dW0ga29tYmluaWVydGVuIFBsb3QgaGluenUKICBpZiAoaXMubnVsbChjb21iaW5lZF9wbG90KSkgewogICAgY29tYmluZWRfcGxvdCA8LSBwbG90CiAgfSBlbHNlIHsKICAgIGNvbWJpbmVkX3Bsb3QgPC0gY29tYmluZWRfcGxvdCArIHBsb3QKICB9Cn0KCiMgWmVpZ2UgZGVuIGtvbWJpbmllcnRlbiBQbG90IGFuCmNvbWJpbmVkX3Bsb3QKYGBgCgoKIyBsb2cgdHJhbnNmb3JtCmBgYHtyfQpjb3VudHJ5ZmFjdHMkSG9taWNpZGU9bG9nKGNvdW50cnlmYWN0cyRIb21pY2lkZSkKY291bnRyeWZhY3RzJEdEUD1sb2coY291bnRyeWZhY3RzJEdEUCkKY291bnRyeWZhY3RzJEluZk1vcnQ9bG9nKGNvdW50cnlmYWN0cyRJbmZNb3J0KQpjb3VudHJ5ZmFjdHMkTGlmZUV4cD1sb2coY291bnRyeWZhY3RzJExpZmVFeHApCiNjb3VudHJ5ZmFjdHMkR0lOST1sb2coY291bnRyeWZhY3RzJEdJTkkpICMgbm90IHRyYW5zZm9ybWVkCmNvdW50cnlmYWN0cyRHZW5kZXJQRWR1PWxvZyhjb3VudHJ5ZmFjdHMkR2VuZGVyUEVkdSkKCmNvdW50cnlmYWN0cwpgYGAKCiMgQ29udHJvbCB0aGUgZGF0YQpgYGB7cn0KbWVhbihjb3VudHJ5ZmFjdHMkSG9taWNpZGUsIG5hLnJtID0gVFJVRSkKbWVhbihjb3VudHJ5ZmFjdHMkR0RQLCBuYS5ybSA9IFRSVUUpCm1lYW4oY291bnRyeWZhY3RzJExpZmVFeHAsIG5hLnJtID0gVFJVRSkKYGBgCgojIGNoYW5naW5nIHZhcmlhYmxlcyBpbnRvIHRoZSBzYW1lIGRpcmVjdGlvbgpgYGB7cn0KIyBSZXZlcnNlIENvZGllcnVuZwpjb3VudHJ5ZmFjdHMkSG9taWNpZGU9c2NhbGUoY291bnRyeWZhY3RzJEhvbWljaWRlKQpjb3VudHJ5ZmFjdHMkR0RQPXNjYWxlKC1jb3VudHJ5ZmFjdHMkR0RQKQpjb3VudHJ5ZmFjdHMkSW5mTW9ydD1zY2FsZShjb3VudHJ5ZmFjdHMkSW5mTW9ydCkKY291bnRyeWZhY3RzJExpZmVFeHA9c2NhbGUoLWNvdW50cnlmYWN0cyRMaWZlRXhwKQpjb3VudHJ5ZmFjdHMkR0lOST1zY2FsZShjb3VudHJ5ZmFjdHMkR0lOSSkKY291bnRyeWZhY3RzJEdlbmRlclBFZHU9c2NhbGUoLWNvdW50cnlmYWN0cyRHZW5kZXJQRWR1KQoKY291bnRyeWZhY3RzCiMgSU1QVVRFIGhhcmRzaGlwIGluZGljYXRvcnMgdy8gbWVkaWFuCmZvciAoY291bnRlciBpbiA0OjkpCnsKICBjb3VudHJ5ZmFjdHNbaXMubmEoY291bnRyeWZhY3RzWyxjb3VudGVyXSksY291bnRlcl09bWVkaWFuKGNvdW50cnlmYWN0c1ssY291bnRlcl0sbmEucm09VFJVRSkKfQpjb3VudHJ5ZmFjdHMKYGBgCgoKCiMgQ3JlYXRlIHRoZSAnaGFyZHNoaXAnIGNvbHVtbiBpbiB0aGUgJ2hhcmRzaGlwJyBkYXRhIGZyYW1lCmBgYHtyfQpjb3VudHJ5ZmFjdHMkaGFyZHNoaXAgPC0gcm93TWVhbnMoY291bnRyeWZhY3RzWywgYygiSG9taWNpZGUiLCAiR0RQIiwgIkdJTkkiLCAiTGlmZUV4cCIsICJJbmZNb3J0IiwgIkdlbmRlclBFZHUiKV0sIG5hLnJtID0gVFJVRSkKCmNvdW50cnlmYWN0cwpgYGAKCgojIENvbnRyb2wgdGhlIGRhdGEKYGBge3J9Cm1lYW4oY291bnRyeWZhY3RzJEhvbWljaWRlLCBuYS5ybSA9IFRSVUUpCm1lYW4oY291bnRyeWZhY3RzJEdEUCwgbmEucm0gPSBUUlVFKQptZWFuKGNvdW50cnlmYWN0cyRMaWZlRXhwLCBuYS5ybSA9IFRSVUUpCmBgYAoKIyBQbG90IGhpc3RvZ3JhbSBvZiBhbGwgaGFyZHNoaXAgaW5kaWNhdG9ycyBhZnRlciBsb2cgdHJhbnNmb3JtCmBgYHtyfQojIFBsb3QgaGlzdG9ncmFtIG9mIGFsbCBoYXJkc2hpcCBpbmRpY2F0b3JzIGFmdGVyIGxvZyB0cmFuc2Zvcm0KIyBMZWVyZXMgUGxvdC1PYmpla3QgZXJzdGVsbGVuCmNvbWJpbmVkX3Bsb3QgPC0gTlVMTAoKIyBEZWZpbmUgdGhlIHZlY3RvciBvZiBsYWJlbHMgZm9yIHRoZSBpdGVtcwppdGVtcyA8LSBjKCJIb21pY2lkZSIsICJHRFAiLCAiR0lOSSIsICJMaWZlRXhwIiwgIkluZk1vcnQiLCAiR2VuZGVyUEVkdSIsICJoYXJkc2hpcCIpCgojIExvb3AgZHVyY2ggamVkZXMgSXRlbSB1bmQgZsO8Z2UgZGFzIEhpc3RvZ3JhbW0genVtIGtvbWJpbmllcnRlbiBQbG90IGhpbnp1CmZvciAoaXRlbSBpbiBpdGVtcykgewogICMgRXJzdGVsbGUgZWluIEhpc3RvZ3JhbW0gZsO8ciBkYXMgYWt0dWVsbGUgSXRlbQogIHBsb3QgPC0gZ2dwbG90KGNvdW50cnlmYWN0cywgYWVzX3N0cmluZyh4ID0gaXRlbSkpICsKICAgIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSwgZmlsbCA9ICJza3libHVlIiwgY29sb3IgPSAiYmxhY2siKSArCiAgICBsYWJzKHRpdGxlID0gcGFzdGUoaXRlbSksCiAgICAgICAgIHggPSBpdGVtLAogICAgICAgICB5ID0gIkZyZXF1ZW5jeSIpICsKICAgIHRoZW1lX21pbmltYWwoKQogIAogICMgRsO8Z2UgZGFzIEhpc3RvZ3JhbW0genVtIGtvbWJpbmllcnRlbiBQbG90IGhpbnp1CiAgaWYgKGlzLm51bGwoY29tYmluZWRfcGxvdCkpIHsKICAgIGNvbWJpbmVkX3Bsb3QgPC0gcGxvdAogIH0gZWxzZSB7CiAgICBjb21iaW5lZF9wbG90IDwtIGNvbWJpbmVkX3Bsb3QgKyBwbG90CiAgfQp9CgojIFplaWdlIGRlbiBrb21iaW5pZXJ0ZW4gUGxvdCBhbgpjb21iaW5lZF9wbG90CmBgYAoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBTVVAgTUFURVJJQUxTOkNvcnJlbGF0aW9uIGJldHdlZW4gaGFyZHNoaXAgaW5kaWNhdG9ycyAKYGBge3J9CnBhbmVsLmNvciA9IGZ1bmN0aW9uKHgsIHksIGRpZ2l0cyA9IDIsIC4uLikKewogIHVzciA9IHBhcigidXNyIik7IG9uLmV4aXQocGFyKHVzcikpCiAgcGFyKHVzciA9IGMoMCwgMSwgMCwgMSkpCiAgIyBjb3JyZWxhdGlvbiBjb2VmZmljaWVudAogIHIgPSBjb3IoeCwgeSx1c2U9ImNvbXBsZXRlLm9icyIpCiAgdHh0ID0gZm9ybWF0KGMociwgMC4xMjM0NTY3ODkpLCBkaWdpdHMgPSBkaWdpdHMpWzFdCiAgdHh0ID0gcGFzdGUoInI9ICIsIHR4dCwgc2VwID0gIiIpCiAgdGV4dCgwLjUsIDAuNiwgdHh0KQogIAogICMgcC12YWx1ZSBjYWxjdWxhdGlvbgogIHAgPSBjb3IudGVzdCh4LCB5LHVzZT0iY29tcGxldGUub2JzIikkcC52YWx1ZQogIHR4dDIgPSBmb3JtYXQoYyhwLCAwLjEyMzQ1Njc4OSksIGRpZ2l0cyA9IGRpZ2l0cylbMV0KICB0eHQyID0gcGFzdGUoInA9ICIsIHR4dDIsIHNlcCA9ICIiKQogIGlmKHA8MC4wMSkgdHh0MiA9IHBhc3RlKCJwICIsICI8MC4wMSIsIHNlcCA9ICIiKQogIHRleHQoMC41LCAwLjQsIHR4dDIpCn0KcGFpcnMoY291bnRyeWZhY3RzWyw0OjEwXSwgdXBwZXIucGFuZWwgPSBwYW5lbC5jb3IsbGFzPTEsY2V4LmxhYmVscz0uOSkgCmRldi5wcmludChwb3N0c2NyaXB0LCJzY2F0dGVyX2luZGljYXRvcnMuZXBzIix3aWR0aD04LCBoZWlnaHQ9OCxob3Jpem9udGFsPUZBTFNFLG9uZWZpbGU9RkFMU0UpCmBgYAoKIyBDcm9uYmFjaCdzIEFscGhhIGZvciBIYXJkc2hpcCBJbmRpY2F0b3JzCmBgYHtyfQpsaWJyYXJ5KHBzeWNoKQoKIyBTdWJzZXQgZGVyIEhhcmRzaGlwLUluZGlrYXRvcmVuIGF1cyBkZW0gY291bnRyeWZhY3RzLURhdGVuc2F0eiBhdXN3w6RobGVuCmhhcmRzaGlwX3N1YnNldCA8LSBjb3VudHJ5ZmFjdHNbLCBjKCJIb21pY2lkZSIsICJHRFAiLCAiSW5mTW9ydCIsICJMaWZlRXhwIiwgIkdJTkkiLCAiR2VuZGVyUEVkdSIpXQoKIyBDcm9uYmFjaCdzIEFscGhhIGJlcmVjaG5lbgphbHBoYV9yZXN1bHQgPC0gYWxwaGEoaGFyZHNoaXBfc3Vic2V0KQphbHBoYV9yZXN1bHQKYGBgCgpgYGB7cn0KIyBFcnNldHplbiBTaWUgIlVTQSIgZHVyY2ggIlVuaXRlZCBTdGF0ZXMiIGltIGNvdW50cnlmYWN0cy1EYXRlbnNhdHoKY291bnRyeWZhY3RzJGNvdW50cnlbY291bnRyeWZhY3RzJGNvdW50cnkgPT0gIlVTQSJdIDwtICJVbml0ZWQgU3RhdGVzIgpgYGAKCiMgTWVyZ2UgdGhlIGRhdGEgbWF0cml4IHdpdGggdGhlIGNvdW50cnlmYWN0cyBkYXRhc2V0IGJhc2VkIG9uIHRoZSBjb3VudHJ5IGNvZGUKYGBge3J9CiMgWnVzYW1tZW5mw7xocmVuIGRlciAnaGFyZHNoaXAnLVZhcmlhYmxlIHZvbiBjb3VudHJ5ZmFjdHMgbWl0IFdWU19kYXRhIGJhc2llcmVuZCBhdWYgZGVtIEzDpG5kZXJuYW1lbgpXVlNfZGF0YSA8LSBtZXJnZShXVlNfZGF0YSwgY291bnRyeWZhY3RzWywgYygiY291bnRyeSIsICJoYXJkc2hpcCIpXSwgYnkgPSAiY291bnRyeSIsIGFsbC54ID0gVFJVRSkKCiMgS29udHJvbGxlIGRlcyBadXNhbW1lbmdlZsO8aHJ0ZW4gRGF0ZW5zYXR6ZXMKaGVhZChXVlNfZGF0YSkKYGBgCgojVHJhbnNmb3JtYXRpb24gb2YgaXRlbSByaXNrdGFraW5nCmBgYHtyfQpXVlNfZGF0YSRyaXNrdGFraW5nID0gNiAtIFdWU19kYXRhJHJpc2t0YWtpbmcgKyAxCmBgYAoKIyBSaXNrdGFraW5nIGFzIG9yZGluYWwgdmFyaWFibGUKYGBge3J9CiMgRGVmaW5lIGludGVydmFscyBmb3Igcmlza3Rha2luZwppbnRlcnZhbCA8LSBjdXQoV1ZTX2RhdGEkcmlza3Rha2luZywgYnJlYWtzID0gYygtSW5mLCAxLCAzLCA1LCBJbmYpLCBsYWJlbHMgPSBjKCJWZXJ5IExvdyIsICJMb3ciLCAiTWVkaXVtIiwgIkhpZ2giKSwgaW5jbHVkZS5sb3dlc3QgPSBUUlVFKQoKIyBBZGQgdGhlIG9yZGluYWwgdmFyaWFibGUgIlJpc2t0YWtpbmdfb3JkaW5hbCIgdG8gdGhlIGRhdGEgZnJhbWUKV1ZTX2RhdGEkUmlza3Rha2luZ19vcmRpbmFsIDwtIGFzLmZhY3RvcihpbnRlcnZhbCkKCiMgRGlzcGxheSB0aGUgdXBkYXRlZCBkYXRhIG1hdHJpeApwcmludChXVlNfZGF0YSkKYGBgCgojIFRyYW5zZm9ybSByaXNrIHZhcmlhYmxlIGludG8gVC1zY29yZSAobWVhbiA9IDUwLCBzZCA9IDEwKQpgYGB7cn0KV1ZTX2RhdGEkVF9zY29yZV9yaXNrdGFraW5nID0gMTAqc2NhbGUoV1ZTX2RhdGEkcmlza3Rha2luZywgY2VudGVyPVRSVUUsc2NhbGU9VFJVRSkrNTAKCiNUcmFuc2Zvcm0gcmlzayB2YXJpYWJsZSBpbnRvIFogc2NvcmUgCiMgQXNzdW1pbmcgVC1zY29yZXMgaGF2ZSBhIG1lYW4gb2YgNTAgYW5kIGEgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIDEwCiNXVlNfZGF0YSRaX3Njb3JlX3Jpc2t0YWtpbmcgPSAoV1ZTX2RhdGEkVF9zY29yZV9yaXNrdGFraW5nIC0gNTApIC8gMTAKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCiNwcmludChXVlNfZGF0YSkKCiNXVlNfZGF0YSA8LSBXVlNfZGF0YSAlPiUKIyAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiMgIG11dGF0ZSh6X3Njb3JlX2FnZSA9IHNjYWxlKGFnZSkpCldWU19kYXRhCmBgYAoKCgojIyMjIyMjIyMjCkNoZWNrIExhdXJhIG9uIEl0ZW1zCiMjIyMjIyMjIwoKYGBge3J9Cmxlbmd0aCh1bmlxdWUoV1ZTX2RhdGEkY291bnRyeSkpCm5yb3coV1ZTX2RhdGEpCnJhbmdlKFdWU19kYXRhJGFnZSwgbmEucm0gPSBUUlVFKQp0YWJsZShXVlNfZGF0YSRnZW5kZXIpCgp0YWJsZShXVlNfZGF0YSRjaGlsZHJlbikKdGFibGUoV1ZTX2RhdGEkbWFycmllZCkKdGFibGUoV1ZTX2RhdGEkZW1wbG95ZWQpCnRhYmxlKFdWU19kYXRhJGVkdWNhdGlvbikKCm1lYW4oV1ZTX2RhdGEkVF9zY29yZV9yaXNrdGFraW5nKQptZWFuKFdWU19kYXRhJGFnZSkKYGBgCgojIyMjIyMjIyMjIyMjIyMjIyMjIwpNSVhFRC1NT0RFTFMgV1ZTLURBVEEKIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgTWl4ZWQtbW9kZWwgV1ZTIC0gUmVwbGljYXRpb24gb2YgTWF0YSBldCBhbC4sIDIwMTYKIyBpbnRlcmNlcHQgb25seSBtb2RlbApgYGB7cn0KbW9kZWwwID0gbG1lcihyaXNrdGFraW5nIH4gMSArICgxfGNvdW50cnkpLGRhdGEgPSBXVlNfZGF0YSkKc3VtbWFyeV9tb2RlbDA9c3VtbWFyeShtb2RlbDApCmBgYAoKIyBhZ2UsIHNleCAKYGBge3J9Cm1vZGVsMSA8LSBsbWVyKHJpc2t0YWtpbmcgfiAxICsgc2NhbGUoYWdlKSArIGZhY3RvcihnZW5kZXIpICsgKDEgKyBzY2FsZShhZ2UpICsgZmFjdG9yKGdlbmRlcikgfCBjb3VudHJ5KSwgCiAgICAgICAgICAgICAgIGRhdGEgPSBXVlNfZGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIpKQpzdW1tYXJ5X21vZGVsMT1zdW1tYXJ5KG1vZGVsMSkKcHJpbnQoc3VtbWFyeV9tb2RlbDEpICMgS29lZmZpemllbnRlbsO8YmVyc2ljaHQgZGVzIE1vZGVsbHMgYW56ZWlnZW4KYGBgCgojIFN1bW1hcnkgbW9kZWwxCmBgYHtyfQpzdW1tYXJ5X21vZGVsMSA8LSBzdW1tYXJ5KG1vZGVsMSkKCiMgR2V3w7xuc2NodGUgV2VydGUgZXh0cmFoaWVyZW4gdW5kIGZvcm1hdGllcmVuCnJlc3VsdHNfbW9kZWwxIDwtIGRhdGEuZnJhbWUoCiAgUHJlZGljdG9yID0gYygiSW50ZXJjZXB0IiwgIkFnZSIsICJHZW5kZXIiKSwKICBFc3RpbWF0ZSA9IGMoc3VtbWFyeV9tb2RlbDEkY29lZmZpY2llbnRzWyIoSW50ZXJjZXB0KSIsICJFc3RpbWF0ZSJdLAogICAgICAgICAgICAgICBzdW1tYXJ5X21vZGVsMSRjb2VmZmljaWVudHNbInNjYWxlKGFnZSkiLCAiRXN0aW1hdGUiXSwKICAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDEkY29lZmZpY2llbnRzWyJmYWN0b3IoZ2VuZGVyKTEiLCAiRXN0aW1hdGUiXSksCiAgU0UgPSBjKHN1bW1hcnlfbW9kZWwxJGNvZWZmaWNpZW50c1siKEludGVyY2VwdCkiLCAiU3RkLiBFcnJvciJdLAogICAgICAgICAgc3VtbWFyeV9tb2RlbDEkY29lZmZpY2llbnRzWyJzY2FsZShhZ2UpIiwgIlN0ZC4gRXJyb3IiXSwKICAgICAgICAgIHN1bW1hcnlfbW9kZWwxJGNvZWZmaWNpZW50c1siZmFjdG9yKGdlbmRlcikxIiwgIlN0ZC4gRXJyb3IiXSksCiAgVF9zY29yZSA9IGMoc3VtbWFyeV9tb2RlbDEkY29lZmZpY2llbnRzWyIoSW50ZXJjZXB0KSIsICJ0IHZhbHVlIl0sCiAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDEkY29lZmZpY2llbnRzWyJzY2FsZShhZ2UpIiwgInQgdmFsdWUiXSwKICAgICAgICAgICAgICBzdW1tYXJ5X21vZGVsMSRjb2VmZmljaWVudHNbImZhY3RvcihnZW5kZXIpMSIsICJ0IHZhbHVlIl0pLAogIHBfdmFsdWUgPSBjKHN1bW1hcnlfbW9kZWwxJGNvZWZmaWNpZW50c1siKEludGVyY2VwdCkiLCAiUHIoPnx0fCkiXSwKICAgICAgICAgICAgICBzdW1tYXJ5X21vZGVsMSRjb2VmZmljaWVudHNbInNjYWxlKGFnZSkiLCAiUHIoPnx0fCkiXSwKICAgICAgICAgICAgICBzdW1tYXJ5X21vZGVsMSRjb2VmZmljaWVudHNbImZhY3RvcihnZW5kZXIpMSIsICJQcig+fHR8KSJdKQopCgojIHAtVmFsdWVzCnJlc3VsdHNfbW9kZWwxJHBfdmFsdWUgPC0gaWZlbHNlKHJlc3VsdHNfbW9kZWwxJHBfdmFsdWUgPCAwLjAwMSwgIjwgLjAwMSIsIHNwcmludGYoIiUuM2YiLCByZXN1bHRzX21vZGVsMSRwX3ZhbHVlKSkKCnByaW50KHJlc3VsdHNfbW9kZWwxKQpgYGAKIyBhZ2UsIHNleCwgYW5kIGNvdmFyaWF0ZXMgKGNoaWxkcmVuLCBtYXJpdGFsIHN0YXR1cywgZW1wbG95ZW1lbnQgc3RhdHVzLCBlZHVjYXRpb24pCmBgYHtyfQptb2RlbDIgPSBsbWVyKHJpc2t0YWtpbmcgfiAxK3NjYWxlKGFnZSkrZmFjdG9yKGdlbmRlcikgKyBmYWN0b3IoY2hpbGRyZW4pICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pKyAoMStzY2FsZShhZ2UpK2ZhY3RvcihnZW5kZXIpKyBmYWN0b3IoY2hpbGRyZW4pICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pfGNvdW50cnkpLGRhdGEgPSBXVlNfZGF0YSxjb250cm9sPWxtZXJDb250cm9sKG9wdEN0cmw9bGlzdChtYXhmdW49MzAwMDApLG9wdGltaXplcj0iYm9ieXFhIikpCnN1bW1hcnlfbW9kZWwyPXN1bW1hcnkobW9kZWwyKQoKcHJpbnQoc3VtbWFyeV9tb2RlbDIpIApgYGAKCiMgU3VtbWFyeSBtb2RlbDIKYGBge3J9CnN1bW1hcnlfbW9kZWwyIDwtIHN1bW1hcnkobW9kZWwyKQoKIyBHZXfDvG5zY2h0ZSBXZXJ0ZSBleHRyYWhpZXJlbiB1bmQgZm9ybWF0aWVyZW4KcmVzdWx0c19tb2RlbDIgPC0gZGF0YS5mcmFtZSgKICBQcmVkaWN0b3IgPSBjKCJJbnRlcmNlcHQiLCAiQWdlIiwgIkdlbmRlciIsICJQYXJlbnRhbCBzdGF0dXMiLCAiTWFyaXRhbCBzdGF0dXMiLCAiT2NjdXBhdGlvbmFsIHN0YXR1cyIsICJFZHVjYXRpb24iKSwKICBFc3RpbWF0ZSA9IGMoc3VtbWFyeV9tb2RlbDIkY29lZmZpY2llbnRzWyIoSW50ZXJjZXB0KSIsICJFc3RpbWF0ZSJdLAogICAgICAgICAgICAgICBzdW1tYXJ5X21vZGVsMiRjb2VmZmljaWVudHNbInNjYWxlKGFnZSkiLCAiRXN0aW1hdGUiXSwKICAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDIkY29lZmZpY2llbnRzWyJmYWN0b3IoZ2VuZGVyKTEiLCAiRXN0aW1hdGUiXSwKICAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDIkY29lZmZpY2llbnRzWyJmYWN0b3IoY2hpbGRyZW4pMSIsICJFc3RpbWF0ZSJdLAogICAgICAgICAgICAgICBzdW1tYXJ5X21vZGVsMiRjb2VmZmljaWVudHNbImZhY3RvcihtYXJyaWVkKTEiLCAiRXN0aW1hdGUiXSwKICAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDIkY29lZmZpY2llbnRzWyJmYWN0b3IoZW1wbG95ZWQpMSIsICJFc3RpbWF0ZSJdLAogICAgICAgICAgICAgICBzdW1tYXJ5X21vZGVsMiRjb2VmZmljaWVudHNbImZhY3RvcihlZHVjYXRpb24pMSIsICJFc3RpbWF0ZSJdKSwKICBTRSA9IGMoc3VtbWFyeV9tb2RlbDIkY29lZmZpY2llbnRzWyIoSW50ZXJjZXB0KSIsICJTdGQuIEVycm9yIl0sCiAgICAgICAgICBzdW1tYXJ5X21vZGVsMiRjb2VmZmljaWVudHNbInNjYWxlKGFnZSkiLCAiU3RkLiBFcnJvciJdLAogICAgICAgICAgc3VtbWFyeV9tb2RlbDIkY29lZmZpY2llbnRzWyJmYWN0b3IoZ2VuZGVyKTEiLCAiU3RkLiBFcnJvciJdLAogICAgICAgICAgc3VtbWFyeV9tb2RlbDIkY29lZmZpY2llbnRzWyJmYWN0b3IoY2hpbGRyZW4pMSIsICJTdGQuIEVycm9yIl0sCiAgICAgICAgICBzdW1tYXJ5X21vZGVsMiRjb2VmZmljaWVudHNbImZhY3RvcihtYXJyaWVkKTEiLCAiU3RkLiBFcnJvciJdLAogICAgICAgICAgc3VtbWFyeV9tb2RlbDIkY29lZmZpY2llbnRzWyJmYWN0b3IoZW1wbG95ZWQpMSIsICJTdGQuIEVycm9yIl0sCiAgICAgICAgICBzdW1tYXJ5X21vZGVsMiRjb2VmZmljaWVudHNbImZhY3RvcihlZHVjYXRpb24pMSIsICJTdGQuIEVycm9yIl0pLAogIFRfc2NvcmUgPSBjKHN1bW1hcnlfbW9kZWwyJGNvZWZmaWNpZW50c1siKEludGVyY2VwdCkiLCAidCB2YWx1ZSJdLAogICAgICAgICAgICAgIHN1bW1hcnlfbW9kZWwyJGNvZWZmaWNpZW50c1sic2NhbGUoYWdlKSIsICJ0IHZhbHVlIl0sCiAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDIkY29lZmZpY2llbnRzWyJmYWN0b3IoZ2VuZGVyKTEiLCAidCB2YWx1ZSJdLAogICAgICAgICAgICAgIHN1bW1hcnlfbW9kZWwyJGNvZWZmaWNpZW50c1siZmFjdG9yKGNoaWxkcmVuKTEiLCAidCB2YWx1ZSJdLAogICAgICAgICAgICAgIHN1bW1hcnlfbW9kZWwyJGNvZWZmaWNpZW50c1siZmFjdG9yKG1hcnJpZWQpMSIsICJ0IHZhbHVlIl0sCiAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDIkY29lZmZpY2llbnRzWyJmYWN0b3IoZW1wbG95ZWQpMSIsICJ0IHZhbHVlIl0sCiAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDIkY29lZmZpY2llbnRzWyJmYWN0b3IoZWR1Y2F0aW9uKTEiLCAidCB2YWx1ZSJdKSwKICBwX3ZhbHVlID0gYyhzdW1tYXJ5X21vZGVsMiRjb2VmZmljaWVudHNbIihJbnRlcmNlcHQpIiwgIlByKD58dHwpIl0sCiAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDIkY29lZmZpY2llbnRzWyJzY2FsZShhZ2UpIiwgIlByKD58dHwpIl0sCiAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDIkY29lZmZpY2llbnRzWyJmYWN0b3IoZ2VuZGVyKTEiLCAiUHIoPnx0fCkiXSwKICAgICAgICAgICAgICBzdW1tYXJ5X21vZGVsMiRjb2VmZmljaWVudHNbImZhY3RvcihjaGlsZHJlbikxIiwgIlByKD58dHwpIl0sCiAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDIkY29lZmZpY2llbnRzWyJmYWN0b3IobWFycmllZCkxIiwgIlByKD58dHwpIl0sCiAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDIkY29lZmZpY2llbnRzWyJmYWN0b3IoZW1wbG95ZWQpMSIsICJQcig+fHR8KSJdLAogICAgICAgICAgICAgIHN1bW1hcnlfbW9kZWwyJGNvZWZmaWNpZW50c1siZmFjdG9yKGVkdWNhdGlvbikxIiwgIlByKD58dHwpIl0pCikKCiMgcC1WYWx1ZXMKcmVzdWx0c19tb2RlbDIkcF92YWx1ZSA8LSBpZmVsc2UocmVzdWx0c19tb2RlbDIkcF92YWx1ZSA8IDAuMDAxLCAiPCAuMDAxIiwgc3ByaW50ZigiJS4zZiIsIHJlc3VsdHNfbW9kZWwyJHBfdmFsdWUpKQoKcHJpbnQocmVzdWx0c19tb2RlbDIpCmBgYAoKYGBge3J9Cm1vZGVsMyA8LSBsbWVyKHJpc2t0YWtpbmcgfiAxK3NjYWxlKGFnZSkqaGFyZHNoaXArZmFjdG9yKGdlbmRlcikqaGFyZHNoaXAgKyBmYWN0b3IoY2hpbGRyZW4pICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pKyAoMStzY2FsZShhZ2UpK2ZhY3RvcihnZW5kZXIpKyBmYWN0b3IoY2hpbGRyZW4pICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pfGNvdW50cnkpLGRhdGEgPSBXVlNfZGF0YSxjb250cm9sPWxtZXJDb250cm9sKG9wdEN0cmw9bGlzdChtYXhmdW49MzAwMDApLG9wdGltaXplcj0iYm9ieXFhIiksUkVNTCA9IEZBTFNFKQpzdW1tYXJ5X21vZGVsMz1zdW1tYXJ5KG1vZGVsMykKCnByaW50KHN1bW1hcnlfbW9kZWwzKQpgYGAKCiMgU3VtbWFyeSBtb2RlbDMKYGBge3J9CiMgWnVzYW1tZW5mYXNzdW5nIGRlcyBNb2RlbGxzIGFuemVpZ2VuCnN1bW1hcnlfbW9kZWwzIDwtIHN1bW1hcnkobW9kZWwzKQoKIyBHZXfDvG5zY2h0ZSBXZXJ0ZSBleHRyYWhpZXJlbiB1bmQgZm9ybWF0aWVyZW4KcmVzdWx0c19tb2RlbDMgPC0gZGF0YS5mcmFtZSgKICBQcmVkaWN0b3IgPSBjKCJJbnRlcmNlcHQiLCAiQWdlIiwgIkdlbmRlciIsICJQYXJlbnRhbCBzdGF0dXMiLCAiTWFyaXRhbCBzdGF0dXMiLCAiT2NjdXBhdGlvbmFsIHN0YXR1cyIsICJFZHVjYXRpb24iLCAiSGFyZHNoaXAiLCAiSW50ZXJhY3Rpb246IEdlbmRlciAqIEhhcmRzaGlwIiksCiAgRXN0aW1hdGUgPSBjKHN1bW1hcnlfbW9kZWwzJGNvZWZmaWNpZW50c1siKEludGVyY2VwdCkiLCAiRXN0aW1hdGUiXSwKICAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzWyJzY2FsZShhZ2UpIiwgIkVzdGltYXRlIl0sCiAgICAgICAgICAgICAgIHN1bW1hcnlfbW9kZWwzJGNvZWZmaWNpZW50c1siZmFjdG9yKGdlbmRlcikxIiwgIkVzdGltYXRlIl0sCiAgICAgICAgICAgICAgIHN1bW1hcnlfbW9kZWwzJGNvZWZmaWNpZW50c1siZmFjdG9yKGNoaWxkcmVuKTEiLCAiRXN0aW1hdGUiXSwKICAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzWyJmYWN0b3IobWFycmllZCkxIiwgIkVzdGltYXRlIl0sCiAgICAgICAgICAgICAgIHN1bW1hcnlfbW9kZWwzJGNvZWZmaWNpZW50c1siZmFjdG9yKGVtcGxveWVkKTEiLCAiRXN0aW1hdGUiXSwKICAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzWyJmYWN0b3IoZWR1Y2F0aW9uKTEiLCAiRXN0aW1hdGUiXSwKICAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzWyJoYXJkc2hpcCIsICJFc3RpbWF0ZSJdLAogICAgICAgICAgICAgICBzdW1tYXJ5X21vZGVsMyRjb2VmZmljaWVudHNbImhhcmRzaGlwOmZhY3RvcihnZW5kZXIpMSIsICJFc3RpbWF0ZSJdKSwKICBTRSA9IGMoc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzWyIoSW50ZXJjZXB0KSIsICJTdGQuIEVycm9yIl0sCiAgICAgICAgICBzdW1tYXJ5X21vZGVsMyRjb2VmZmljaWVudHNbInNjYWxlKGFnZSkiLCAiU3RkLiBFcnJvciJdLAogICAgICAgICAgc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzWyJmYWN0b3IoZ2VuZGVyKTEiLCAiU3RkLiBFcnJvciJdLAogICAgICAgICAgc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzWyJmYWN0b3IoY2hpbGRyZW4pMSIsICJTdGQuIEVycm9yIl0sCiAgICAgICAgICBzdW1tYXJ5X21vZGVsMyRjb2VmZmljaWVudHNbImZhY3RvcihtYXJyaWVkKTEiLCAiU3RkLiBFcnJvciJdLAogICAgICAgICAgc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzWyJmYWN0b3IoZW1wbG95ZWQpMSIsICJTdGQuIEVycm9yIl0sCiAgICAgICAgICBzdW1tYXJ5X21vZGVsMyRjb2VmZmljaWVudHNbImZhY3RvcihlZHVjYXRpb24pMSIsICJTdGQuIEVycm9yIl0sCiAgICAgICAgICBzdW1tYXJ5X21vZGVsMyRjb2VmZmljaWVudHNbImhhcmRzaGlwIiwgIlN0ZC4gRXJyb3IiXSwKICAgICAgICAgIHN1bW1hcnlfbW9kZWwzJGNvZWZmaWNpZW50c1siaGFyZHNoaXA6ZmFjdG9yKGdlbmRlcikxIiwgIlN0ZC4gRXJyb3IiXSksCiAgVF9zY29yZSA9IGMoc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzWyIoSW50ZXJjZXB0KSIsICJ0IHZhbHVlIl0sCiAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzWyJzY2FsZShhZ2UpIiwgInQgdmFsdWUiXSwKICAgICAgICAgICAgICBzdW1tYXJ5X21vZGVsMyRjb2VmZmljaWVudHNbImZhY3RvcihnZW5kZXIpMSIsICJ0IHZhbHVlIl0sCiAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzWyJmYWN0b3IoY2hpbGRyZW4pMSIsICJ0IHZhbHVlIl0sCiAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzWyJmYWN0b3IobWFycmllZCkxIiwgInQgdmFsdWUiXSwKICAgICAgICAgICAgICBzdW1tYXJ5X21vZGVsMyRjb2VmZmljaWVudHNbImZhY3RvcihlbXBsb3llZCkxIiwgInQgdmFsdWUiXSwKICAgICAgICAgICAgICBzdW1tYXJ5X21vZGVsMyRjb2VmZmljaWVudHNbImZhY3RvcihlZHVjYXRpb24pMSIsICJ0IHZhbHVlIl0sCiAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzWyJoYXJkc2hpcCIsICJ0IHZhbHVlIl0sCiAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzWyJoYXJkc2hpcDpmYWN0b3IoZ2VuZGVyKTEiLCAidCB2YWx1ZSJdKSwKICBwX3ZhbHVlID0gYyhzdW1tYXJ5X21vZGVsMyRjb2VmZmljaWVudHNbIihJbnRlcmNlcHQpIiwgIlByKD58dHwpIl0sCiAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzWyJzY2FsZShhZ2UpIiwgIlByKD58dHwpIl0sCiAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzWyJmYWN0b3IoZ2VuZGVyKTEiLCAiUHIoPnx0fCkiXSwKICAgICAgICAgICAgICBzdW1tYXJ5X21vZGVsMyRjb2VmZmljaWVudHNbImZhY3RvcihjaGlsZHJlbikxIiwgIlByKD58dHwpIl0sCiAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzWyJmYWN0b3IobWFycmllZCkxIiwgIlByKD58dHwpIl0sCiAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzWyJmYWN0b3IoZW1wbG95ZWQpMSIsICJQcig+fHR8KSJdLAogICAgICAgICAgICAgIHN1bW1hcnlfbW9kZWwzJGNvZWZmaWNpZW50c1siZmFjdG9yKGVkdWNhdGlvbikxIiwgIlByKD58dHwpIl0sCiAgICAgICAgICAgICAgc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzWyJoYXJkc2hpcCIsICJQcig+fHR8KSJdLAogICAgICAgICAgICAgIHN1bW1hcnlfbW9kZWwzJGNvZWZmaWNpZW50c1siaGFyZHNoaXA6ZmFjdG9yKGdlbmRlcikxIiwgIlByKD58dHwpIl0pCikKCiMgRm9ybWF0aWVydW5nIGRlciBwLVdlcnRlCnJlc3VsdHNfbW9kZWwzJHBfdmFsdWUgPC0gaWZlbHNlKHJlc3VsdHNfbW9kZWwzJHBfdmFsdWUgPCAwLjAwMSwgIjwgLjAwMSIsIHNwcmludGYoIiUuM2YiLCByZXN1bHRzX21vZGVsMyRwX3ZhbHVlKSkKCiMgRXJnZWJuaXNzZSBhbnplaWdlbgpwcmludChyZXN1bHRzX21vZGVsMykKYGBgCgoKIyBBTk9WQQpgYGB7cn0KYW5vdmEobW9kZWwwLG1vZGVsMSkKYW5vdmEobW9kZWwxLG1vZGVsMikKYW5vdmEobW9kZWwyLG1vZGVsMykgCmBgYAoKYGBge3J9CldWU19kYXRhCmBgYAoKCmBgYHtyfQpjb2Vmc2FsbG1vZGVscz1yYmluZChzdW1tYXJ5X21vZGVsMSRjb2VmZmljaWVudHMsCnN1bW1hcnlfbW9kZWwyJGNvZWZmaWNpZW50cywKc3VtbWFyeV9tb2RlbDMkY29lZmZpY2llbnRzW2MoMToyLDQ6OCwzLDk6MTApLF0pCgp3cml0ZS5jc3YoY29lZnNhbGxtb2RlbHMsImNvZWZzYWxsbW9kZWxzLmNzdiIpCmBgYAoKIyBEZWxldGUgd2hlbiBzdWJtaXR0aW5nIHRoZSBjb2RlIC0tPiBqdXN0IGZvciBtZSB0byBrbm93IHdoZXJlIHRoZSBkb2N1bWVudCBpcwpgYGB7cn0KZmlsZV9wYXRoIDwtIGZpbGUucGF0aChnZXR3ZCgpLCAiY29lZnNhbGxtb2RlbHMuY3N2IikKZmlsZV9wYXRoCmBgYAoKYGBge3J9CiMgRXh0cmFoaWVyZW4gZGVyIEtvZWZmaXppZW50ZW4tVGFiZWxsZSBmw7xyIGplZGVzIE1vZGVsbApjb2VmZmljaWVudHNfbW9kZWwwIDwtIHN1bW1hcnkobW9kZWwwKSRjb2VmZmljaWVudHMKY29lZmZpY2llbnRzX21vZGVsMSA8LSBzdW1tYXJ5KG1vZGVsMSkkY29lZmZpY2llbnRzCmNvZWZmaWNpZW50c19tb2RlbDIgPC0gc3VtbWFyeShtb2RlbDIpJGNvZWZmaWNpZW50cwpjb2VmZmljaWVudHNfbW9kZWwzIDwtIHN1bW1hcnkobW9kZWwzKSRjb2VmZmljaWVudHMKCiMgRmlsdGVybiBkZXIgZXJmb3JkZXJsaWNoZW4gWmVpbGVuIGF1cyBkZW4gS29lZmZpemllbnRlbgpjb2VmZmljaWVudHNfbW9kZWwwIDwtIGNvZWZmaWNpZW50c19tb2RlbDBbcm93bmFtZXMoY29lZmZpY2llbnRzX21vZGVsMCkgJWluJSBjKCIoSW50ZXJjZXB0KSIsICJzY2FsZSh6X3Njb3JlX2FnZSkiLCAiZmFjdG9yKGdlbmRlcikiKSwgXQpjb2VmZmljaWVudHNfbW9kZWwxIDwtIGNvZWZmaWNpZW50c19tb2RlbDFbcm93bmFtZXMoY29lZmZpY2llbnRzX21vZGVsMSkgJWluJSBjKCIoSW50ZXJjZXB0KSIsICJzY2FsZSh6X3Njb3JlX2FnZSkiLCAiZmFjdG9yKGdlbmRlcikiKSwgXQpjb2VmZmljaWVudHNfbW9kZWwyIDwtIGNvZWZmaWNpZW50c19tb2RlbDJbcm93bmFtZXMoY29lZmZpY2llbnRzX21vZGVsMikgJWluJSBjKCIoSW50ZXJjZXB0KSIsICJzY2FsZSh6X3Njb3JlX2FnZSkiLCAiZmFjdG9yKGdlbmRlcikiLCAiZmFjdG9yKGNoaWxkcmVuKSIsICJmYWN0b3IobWFycmllZCkiLCAiZmFjdG9yKGVtcGxveWVkKSIsICJmYWN0b3IoZWR1Y2F0aW9uKSIpLCBdCmNvZWZmaWNpZW50c19tb2RlbDMgPC0gY29lZmZpY2llbnRzX21vZGVsM1tyb3duYW1lcyhjb2VmZmljaWVudHNfbW9kZWwzKSAlaW4lIGMoIihJbnRlcmNlcHQpIiwgInNjYWxlKHpfc2NvcmVfYWdlKSIsICJmYWN0b3IoZ2VuZGVyKSIsICJmYWN0b3IoY2hpbGRyZW4pIiwgImZhY3RvcihtYXJyaWVkKSIsICJmYWN0b3IoZW1wbG95ZWQpIiwgImZhY3RvcihlZHVjYXRpb24pIiwgImhhcmRzaGlwIiwgInNjYWxlKHpfc2NvcmVfYWdlKTpoYXJkc2hpcCIsICJmYWN0b3IoZ2VuZGVyKTpoYXJkc2hpcCIpLCBdCgojIFp1c2FtbWVuZsO8aHJlbiBkZXIgZ2VzY2jDpHR6dGVuIEtvZWZmaXppZW50ZW4gYXVzIGFsbGVuIE1vZGVsbGVuCmNvZWZzX2FsbF9tb2RlbHMgPC0gcmJpbmQoY29lZmZpY2llbnRzX21vZGVsMCwgY29lZmZpY2llbnRzX21vZGVsMSwgY29lZmZpY2llbnRzX21vZGVsMiwgY29lZmZpY2llbnRzX21vZGVsMykKCiMgRXJzdGVsbGVuIGVpbmVyIFRhYmVsbGUgYXVzIGRlbiBLb2VmZml6aWVudGVuCnJlc3VsdHNfdGFibGUgPC0gZGF0YS5mcmFtZSgKICBQcmVkaWN0b3IgPSByb3duYW1lcyhjb2Vmc19hbGxfbW9kZWxzKSwKICBiID0gY29lZnNfYWxsX21vZGVsc1ssICJFc3RpbWF0ZSJdLAogIFNFID0gY29lZnNfYWxsX21vZGVsc1ssICJTdGQuIEVycm9yIl0sCiAgVF9zY29yZSA9IGNvZWZzX2FsbF9tb2RlbHNbLCAidCB2YWx1ZSJdLAogIHBfdmFsdWUgPSBjb2Vmc19hbGxfbW9kZWxzWywgIlByKD58dHwpIl0KKQoKIyBEcnVja2VuIGRlciBFcmdlYm5pc3RhYmVsbGUKcmVzdWx0c190YWJsZQpgYGAKCgoK